我正在使用和使用Lucene来索引我们的数据,并且我遇到了一些关于DocValues字段的奇怪行为。
那么,有没有人可以解释常规文档字段(如 StringField , TextField , IntField 等)和DocValues之间的区别领域 (比如 IntDocValuesField , SortedDocValuesField (类型似乎在Lucene 5.0中有变化)等等。)
首先,为什么我不能使用 document.get(fieldname)访问DocValues?如果是这样,我该如何访问它们?
其次,我已经看到在Lucene 5.0中有些功能发生了变化,例如排序只能在DocValues上完成......为什么会这样?
第三,DocValues可以更新,但常规字段不能更新(你必须删除并添加整个文档)......
此外,也许最重要的是,何时我应该使用DocValues和常规字段?
约瑟夫
答案 0 :(得分:7)
大多数问题都可以通过引用Solr Wiki或网络搜索来快速回答,但要获得DocValues的要点:它们对于与现代搜索服务相关的所有其他内容都很有用,除了实际搜索。来自Solr Community Wiki:
DocValues是一种在内部记录字段值的方法,这种方法在某些方面更有效,例如排序和分面,然后是传统的索引。
...
DocValue字段现在是面向列的字段,在索引时构建了文档到值的映射。这种方法有望减轻fieldCache的一些内存需求,并且可以更快地查找分面,排序和分组。
这也应该回答为什么Lucene 5需要DocValues进行排序 - 它比以前的方法更有效率。
原因是,在为这些操作收集数据时,标准格式为the storage format is turned around,其中应用程序以前必须通过每个文档来查找值,现在可以查找值并找到相应的文件。当您已经拥有执行交叉点所需的文档列表时,这非常有用。
如果我没记错的话,更新基于DocValue的字段包括从先前的令牌列表中取出文档,然后将其重新插入到新位置,与先前的方法相比,它会更改依赖项的负载(和重新索引是唯一可行的策略。)
将DocValues用于需要上述任何属性的字段,例如排序/分面/等。