- 浏览: 200264 次
- 性别:
- 来自: 北京
最新评论
-
粟谷_sugu:
干货!!!膜拜大神,持续学习
lucene中的docValue实现源码解读(三)——NumericDocValue的读取 -
suichangkele:
我的qq:1308567317
solr VS es -
wangq332:
老哥,我是solr的新司机,除了官方doc之外,其他的资料确实 ...
solr VS es -
一缕欢笑:
solrCloud中的路由策略:DocRouter、CompositeIdRouter、ImplicitDocRouter
文章列表
之前使用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 ...