Solr lucene字段与DocValue

Solr lucene字段与DocValue,solr,lucene,Solr,Lucene,我正在使用Lucene对数据进行索引,我遇到了一些关于DocValues字段的奇怪行为 那么,有人能解释一下常规文档字段(如StringField、TextField、IntField等)和DocValues字段之间的区别吗 (如IntDocValuesField,SortedDocValuesField(这些类型似乎在Lucene 5.0中有所变化)等) 首先,为什么我不能使用document.get(fieldname)访问DocValues?如果是,我如何访问它们 其次,我看到Lucene

我正在使用Lucene对数据进行索引,我遇到了一些关于DocValues字段的奇怪行为

那么,有人能解释一下常规文档字段(如StringFieldTextFieldIntField等)和DocValues字段之间的区别吗 (如IntDocValuesFieldSortedDocValuesField(这些类型似乎在Lucene 5.0中有所变化)等)

首先,为什么我不能使用document.get(fieldname)访问DocValues?如果是,我如何访问它们

其次,我看到Lucene 5.0中的一些特性发生了变化,例如排序只能在DocValues上进行。。。为什么呢

第三,DocValues可以更新,但常规字段不能(您必须删除并添加整个文档)

而且,也许最重要的是,我应该在什么时候使用DocValues,什么时候使用正则字段


Joseph

这些问题中的大多数都可以通过参考Solr Wiki或web搜索快速得到答案,但要了解DocValues的要点:除了实际搜索之外,它们对与现代搜索服务相关的所有其他内容都很有用。从:

DocValues是一种在内部记录字段值的方法,与传统索引相比,它在某些方面(如排序和刻面)更有效

DocValue字段现在是面向列的字段,在索引时构建了文档到值的映射。这种方法有望减轻fieldCache的一些内存需求,并更快地查找分面、排序和分组

这也应该回答为什么Lucene 5需要DocValues进行排序——它比以前的方法效率高很多

其原因是,根据为这些操作收集数据时的标准格式,应用程序以前必须遍历每个文档才能找到值,现在可以查找值并找到相应的文档。当您已经有了需要执行交集的文档列表时,这非常有用

如果我没记错的话,更新基于DocValue的字段需要将文档从以前的令牌列表中拉出,然后将其重新插入新位置,而以前的方法会改变依赖项的负载(重新索引是唯一可行的策略)


对需要上述任何属性的字段使用DocValues,如排序/刻面等。

谢谢,但这并不能真正回答问题。我知道他们在分类方面更有效。。。但这并不能解释这种奇怪的行为。如何从文档中检索它们的值?document.get(fieldname)似乎不起作用,如果我无法访问它有什么好处?@YossiVainshtein它回答了您的大多数问题-您的字段是否已存储?只有存储的字段才会返回值;docValues是一种索引策略,不应影响可检索性。如果您有实际的代码要开始工作,请提供一个关于这个问题的最小示例。我在理解何时不使用DocValues以及Apache Solr的一般文档时遇到了一些问题。有人说,这些问题中的大多数都是通过引用SolrWiki或网络搜索快速得到答案,这让人很恼火。你这么说是因为你不认为海报在提问前做了尽职调查,还是因为你认为这是一个有用的事实?如果是前者,至少可以说是侮辱,相信我,对于很多人来说,这就是他们在转向stackoverflow之前阅读文档的原因。如果是后者,请不要浪费时间。每个人都知道ApacheSolr有文档,如果它让解决方案变得显而易见,我相信op一开始就不会问。上周,我一页一页地阅读了Solr的文档;事实上,除了吃饭和8小时锻炼,我什么也不做。当我看到人们说Solr的文档质量不高,或者有一些初始学习阶段很难克服时,我并不感到惊讶;特别是当它与Sphinx或ElasticSearch进行比较时。我认为,如果不是每次有人提出关于Solr的问题时都引用SolrWiki,而是开发人员花时间思考文档可能存在的缺陷,那么我不会在一年多后看到这篇文章,并提出类似的问题。