`
suichangkele
  • 浏览: 200264 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
之前使用solr的时候,也接触过functionQuery,他就是用来对一个doc计算得分的,只改变排序,不改变match。es的functionQuery是第一次接触,看了看公司的代码,然后百度了一下,最后再看了下ES的官方文档,算是把ES的functionQuery给弄清楚了,再次记录下来。   ES的functionQuery需要两个主要变量,一个是query,用来计算候选集,也就是所有的doc的来源,一个是functionQuery,代码如下: GET /_search { "query": { "function_score&q ...

2021年跳槽的总结

2021年的跳槽计划已经结束了,最终的结果是入职了这一家不大不小的公司,待遇也一般,比之前涨了20%左右,完完全全没有达到我的预期,我预期能涨30-40%的。现在来看这次跳槽是非常失败的,与我的预期差距巨大。下面从多 ...
lucene fst 源代码 解读   在lucene的官方文档里,有读取的代码的介绍,直接用了一个Util类,代码如下,方法名字是:org.apache.lucene.util.fst.Util.get(FST<T>, IntsRef) /** Looks up the output for this input, or null if the input is not accepted. */ public static <T> T get(FST<T> fst, IntsRef input) throws IOException { // ...
lucene fst 源代码 解读    FST中最麻烦的其实是压缩,压缩的代码很难懂,必要性也不是很大(比如再词典表的存储的时候就没有使用压缩),所以我就仅把代码注释写上了,我估计有可能读的人不会很多,所以就不过多解释了.压缩的本质是对那些含有指向自己的arc的数量很多node编号做精简,有两种方式,或者是使用一个单独的对象记录这种节点的编号到位置的映射,在记录一个arc的指向的target的位置的时候记录编号,然后再用编号查找位置;或者是使用target的开始位置和指向这个节点的arc的开始位置差值(因为target一定再arc的后面,插值一定会更小)。在压缩之前生成的BytesSt ...
lucene fst 源代码 解读   前面讲到调用FST.finish方法了,进入到这个阶段的前提是所有的term都已经被编译进fst了,也就是写入到bytes中了。看下代码如下: /** 当编译root节点之后调用,传入的是root节点的编号(或者是在bytes中的开始位置) */ void finish(long newStartNode) throws IOException { assert newStartNode <= bytes.getPosition(); if (startNode != -1) { throw new IllegalState ...
上一篇看完了FST.Builder的代码了,这里写FST代码了。先看编译节点时是如何操作的,即org.apache.lucene.util.fst.FST.addNode(Builder<T>, UnCompiledNode<T>)方法: long addNode(Builder<T> builder, Builder.UnCompiledNode<T> nodeIn) throws IOException { T NO_OUTPUT = outputs.getNoOutput(); if (nodeIn.numArcs == 0 ...
本篇博客介绍FST的生成。它使用的是生成器模式,因为FST的生成太复杂了,所以必须使用生成器模式,他的类是:org.apache.lucene.util.fst.Builder.Builder(INPUT_TYPE, int, int, boolean, boolean, int, Outputs<T>, boolean, float, boolean, int),代码如下: /** inputType 表示的是输入的类型,FST规定只能输入数字类型,字符串的输入也要转化为数字,这里是判断字符串的范围,不同的INPUT_TYPE有不同的范围 minSuffixCount1: ...
FST是什么,最开始我也不知道,直到我看了两篇博客,http://www.shenyanchao.cn/blog/2018/12/04/lucene-fst/    https://blog.csdn.net/zx2011302580235/article/details/88594342  看完了之后才真的懂了什么是FST,所以建议大家先看一遍这两篇博客,然后再看我的,因为我写的不是介绍FST的,而是深入到代码层面。 在之前研究IK的时候,看了他存储词典的格式,接触到了前缀树这种数据结构,他的好处是可以共享前缀,但是并不能共享后缀,而FST就能共享后缀,实现更加高效的存储或者查找。当然F ...
先总结下之前3篇介绍mutable的文章,mutable可以分为两大类,一类是packed,一类是packed_single_block,前者是永远不会浪费空间的,每个数字的存储都是紧密连接的,后者可能会浪费空间,所以为了尽可能少的浪费空间,它对bitsPerValue做了限制,只提供部分的bitsPerValue。两者的共同点是都是使用多个数字来表示多个数字,有的用byte[],有的用short[],有的用int[],还有的用long[]。packed的按照一个数字跨不跨越存储的数字还可以分为两种,一种是不跨越的,比如Direct8 Direct16这种,还有是跨越的,比如Packed16 ...
dd 为了验证之前关闭连接的操作,写了如下代码: public static void main(String[] args) throws IOException, InterruptedException { PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(100000L, TimeUnit.SECONDS);//指定一个连接的生存时间最大为100秒。 manager.setDefaultMaxPerRoute(1);//指定一个router缓存的最大 ...
上一篇中主要说了借出后怎么使用,这一篇主要介绍使用完了如何归还,再次回到使用的部分的代码里面,MinimalClientExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext, HttpExecutionAware)中的最后几行 final ConnectionHolder releaseTrigger = new ConnectionHolder(log, connManager, managedConn);//用一个对象封装借出来的connection,方便复用 。。。省略很多不需要的 if (reuseStrat ...
上一个文章说了http连接的缓存池,以及借出的过程,借出使用的是HttoRoute,先根据route定位到RouteSpecificPool,然后从RouteSpecificPool中借出一个httpConnection,借出后都是用一个Entry包装的,entry里面含有httpRouter+httpConnection。这一篇说 ...
工作以来在使用java代码调用一个http协议的请求时都是使用的httpClient,但是工作四年多了一直没有好好研究一下httpClient的内部原理,只知道他和数据库的连接池一样也是有缓存池的,数据库缓存池也没有看原理,所以最近有时 ...
继续回到最开始的获得mutable的代码那里去 public static Mutable getMutable(int valueCount, int bitsPerValue, PackedInts.Format format) { assert valueCount >= 0; switch (format) { case PACKED_SINGLE_BLOCK: return Packed64SingleBlock.create(valueCount, bitsPerValue);//这个已经说完了, ca ...
紧接上一篇文章,介绍一下Packed64SingleBlock.create方法。 public static Packed64SingleBlock create(int valueCount, int bitsPerValue) { switch (bitsPerValue) {//这个方法里面会根据bitPerValue来查看使用哪一个类,我们看看前几个吧。 case 1: return new Packed64SingleBlock1(valueCount); case 2: return ...
Global site tag (gtag.js) - Google Analytics