- 浏览: 199942 次
- 性别:
- 来自: 北京
最新评论
-
粟谷_sugu:
干货!!!膜拜大神,持续学习
lucene中的docValue实现源码解读(三)——NumericDocValue的读取 -
suichangkele:
我的qq:1308567317
solr VS es -
wangq332:
老哥,我是solr的新司机,除了官方doc之外,其他的资料确实 ...
solr VS es -
一缕欢笑:
solrCloud中的路由策略:DocRouter、CompositeIdRouter、ImplicitDocRouter
文章列表
之前在看lucene4.x的源码的时候,老是遇见packedInts这个类,当时没有看懂,所以这个周一没事做又看了一下,茅塞顿开,看懂了,记个笔记,装一下B。如果读者认为我的博客中含有错误,请联系我,我的qq是1308567317,以免误人子弟。
顺便说一下,我这里看的是lucene6.6.0的代码。
之前阿帅写个关于博客是写PackedInts,不过他仅仅写了PackedInts的思路和好处,没有深入到代码中,我个人还是感觉不爽,我喜欢一行一行的抠代码。PackedInt的好处我这里就不再写了,可以参考帅广应的博客(http://blog.51cto.com/sbp810050504/ ...
如果你觉得我的代码里有bug,可以联系我,我的qq是1308567317 。
一年前写了一篇文章介绍有顺序的spanNearQuery,地址为:http://suichangkele.iteye.com/blog/2348256,现在才会想起来,还有一篇没写呢,即没有顺序的spanNearQuery,今天在看之前的博客的时候,突然发现,所以写一下吧。
没有顺序的spanQuery的意思是,只要多个span挨着足够近的距离即可,不需要按照一定的顺序出现,而且也没有不能重叠的限制(在有顺序的SpanNearQuery中是有不能重叠的这个限制的)。在SpanNearQuery.getS ...
上一篇博客中写了单值域数字类型的域是如何做facet的,这一篇写单值域的非数字类型的facet。他的思路是分开多个段进行收集,在收集后最后再进行聚合操作,每个段的收集都会在一个线程中进行,也就是多个线程处理多个段 ...
(这个使用的solr的版本是4.10)
承接上一篇文章,在对单值域的数字类型的域做facet的时候,会使用FCS方法,里面再调用的方法是NumericFacets.getCounts(searcher, base, field, offset, limit, mincount, missing, sort);所以看看这个的代码吧:
/**
* 处理单值域的数字类型的facet
* @param searcher
* @param docs 基础范围(即有q和fq确定的所有的doc的id)
* @param fieldName 要facet的域的名字
* @para ...
facet.field比facet.query要复杂的多,参数也更多,看看代码吧,方法是:SimpleFacets.getFacetFieldCounts()
public NamedList<Object> getFacetFieldCounts() throws IOException, SyntaxError {
NamedList<Object> res = new SimpleOrderedMap<>();
String[] facetFs = ...
之前写完了docValue的内容,但是如何获取docValue呢?或者将这个问题在宽泛一些,如何获取doc的正向信息,很简单,就是FieldCache,FieldCache采取了一个单利模式,他有一个实现类叫做FieldCacheImpl。所有的获取正向信息的操作都是通过这个类的getxxx方法,在这个通用的方法里面,所有的逻辑都是一样,如果一个域有docValue,则优先会的dcoValues,如果没有则读取这个域的词典表,unInvert,即将倒排表读取到内存中,然后每个doc再进行计算,将每个doc和每个term对应起来,然后再一个大Map中存起来。从效果上来看,在第一次读取的时候,如 ...
solr的facet query意思很简单,表示在所有的搜索到的结果中,符合某个query的doc有多少个。他的实现原理也很简单。
solr中所有的facet的操作都在facetComponent中,在这个类的process方法里面,会将facet委托给SimpleFacet这个类,然后调用simpleFacet.getFacetCounts方法。我们要说的facet.query就是在这个类中,如下:
public NamedList<Object> getFacetCounts() {
// if someone called this method, benefit ...
前面写了十来篇博客都是介绍lucene的docValue的,有五中docValue,但是在solr里面却只有一个配置,即在schema.xml中的<field>中添加docValues=true,那么solr在建立索引的时候到底是使用了什么类型的docValue呢?看下源码就知道了。
sol ...
看完了lucene4.10.4的docValue的五种格式,做个总结吧,顺便和农历的2017说声拜拜,跨年夜,写博客,我估计是中国唯一。
一共五种格式,其中有三种是单值的,Binary,numeric,SortedDocValue,其中Numeric有三种存放格式,分别是压缩表、差值、公约数+差值,Binary可以认为就一种,SortedDocValue的存储格式稍微复杂些,他添加了获得排序的功能;还有两种多值域的,一个是SortedNumericDocValue,一个是SortedSet,其中SortedNumericDocValue虽然带有排序,但是实际上不是堆所有的doc进行排序,而 ...
对于SetDocValue的读取很简单,因为他的写入的格式和之前的SortedDocValue和SortedNumericDocValue有很多重复的地方,所以在读取的时候也是有很多重复的地方。
先看看最终要返回的接口吧,
public abstract class SortedSetDocValues {
/** Sole constructor. (For invocation by subclass constructors, typically implicit.) */
protected SortedSetDocValues() {}
/*** When ...
看看最后一种docValue,sortedSet,他有点难,如果不是之前看了四种其他的格式的话,不是很容易理解,同理,如果看懂了其他的格式,则很容易理解。先说一下SortedSet吧,它是存储的byte[],一个doc是可以有多个值的,在存储的时候,是排序的,即在索引中是可以查找到每个doc的byte[]的排序的。他的存储是综合了sortedDocValue(存储排序的单值byte[])和SortedNumericDocValue,在存储的时候对于所有的byte[]是要先获得对应的排序,如果我们把顺序的地方和具体的byte[]值分开的话,单独存放所有的byte[]就可以使用和Sorte ...
再看具体的读取过程之前,先看一下SortedNumericDocValue接口的功能吧,
public abstract class SortedNumericDocValues {
/** Sole constructor. (For invocation by subclass constructors, typically implicit.) */
protected SortedNumericDocValues() {}
/** 定位到某个doc */
public abstract void setDocument(int doc);
...
SortedNumericDocValue,乍一看,有好多疑问困扰着我,这种类型的存储的也是排序的吗?是不是可以通过docid获得其排序?是不是和SortedBinaryDocValue一样也是单值域的?带着这些疑问,看完了代码,发现完全不是。SortedNumericDocValue不 ...
之前的一个博客中写了sortedDocValue的写入,这次看看再使用sortedDocValue的时候是如何读取的。读取的方法还是掌握在Lucene410DocValuesProducer中,方法是public SortedDocValues getSorted(FieldInfo field),我们先看一下这个方法返回的对象SortedDocValue吧,在这个类的源码中可以发现这个类是继承自于BinaryDocValues,所以上一篇博客中说的SortedDocValue就是SortedBinaryDocValue也就是正确的了,lucene是故意省去了Binary。他的方法除了Bin ...
之前写了NumericDocValue(存储数字的)和BinaryDocValue(存储byte[]的),今天看看存储带有排序的byte[]的docValue,也就是SortedDocValue,这里没有写为SortedBinaryDocValue,可能是为了省略吧,SortedDocValue特指的就排是序的byte[]。注意,之前在写NumericDocValue和BinaryDocValue的时候,忘了说一个事情,就是他们要求每个doc只能存储一个值,即一个数字或者一个byte[],这里SotedDocValue也是一样,每个doc只能有一个byte[]。这里说的排序是指每个doc的 ...