今天斗胆来试试DocValues,对于DocValues我想大家都不会觉得陌生,同时又不是非常熟悉,就是那种熟悉而又陌生的感觉。
一、docValues是什么鬼呢?
DocValues在LUCENE-3518才引入新特征,初生在Lucene4.0,由Mike(Michael McCandless)提出的。从此Lucene牛逼轰轰了。
- 先来介绍一下什么是倒排索引(反向索引),什么是正向索引。
- 倒排索引
倒排索引,又称反向索引。故名思义是从term反向找到文档,存储结构是词条对应含有该词条的文档集。倒排索引是全文检索的基础,让全文检索的效率大大的提高。通常使用倒排索引来避免在每篇文档中使用冗长的顺序查找查询词。 - 正向索引
正向索引,即是通过文档号找到字段的。
1.1 倒排那么好,为什么还需要正向索引呢?
接下来一段的话,大神略过。我们再来回顾一下倒排索引的搜索排序过程
我们已经知道倒排表存储了term 对就在的 docIds,也就是说我们可以用它非常高效的找到所有含有查询词的文档得到一个结果集。这个结果集含有满足查询条件的docid(即文档号),这个结果集极有可能非常大。
这里有两个非常重要的件:1. 结果集只有含文档号,不含文档的内容;2. 这个结果集很大,有很多个文档号。
当然一般来我们并不需要整个结果集,只需要按一定条件topK。
- 当一定条件是指按相似度(Similarity得分)排序时,倒排索引依然非常完美。
- 当一定条件是指除相似度排序之外,还需要依赖文档的一个或者多个字段时(即sort=f desc),其实是不是必须读取原文档,然后对应字段拿出来排序呢?答案是肯定。
所以倒排索引很好,但好像并不能解决一切问题。
- 对索引文件的变小了,之前需要存储了全文档,现在单字段。——可以减少移动的长度
- 少了读到文档要还要进行二次解释找到字段值的过程。—— 减少运算
对应此场景这个优化过程看似并不起眼,实际上在数据比较大的时候效果还是比较显著的。
按正向索引的定义,正向索引就是上面的优化方案,通过文档号直接找到字段值。因此正向索引又称为列存储。
二、正向索引
solr docs对docValues的说明如下:
The standard way that Solr builds the index is with an inverted index. This style builds a list of terms found in all the documents