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