lucene Fields vs. DocValues

Yos*_*ein 8 lucene solr

我正在使用和使用Lucene来索引我们的数据,并且我遇到了一些关于DocValues字段的奇怪行为.

那么,任何人都可以解释常规Document字段(如StringField,TextField,IntField等)和DocValues字段(如IntDocValuesField,SortedDocValuesField(Lucene 5.0中的类型似乎有变化)等)之间的区别等等吗?

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

其次,我已经看到在Lucene 5.0中一些功能被更改,例如排序只能在DocValues上完成......为什么会这样?

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

此外,也许最重要的是,何时我应该使用DocValues和常规字段?

约瑟夫

Mat*_*ndh 7

大多数问题都可以通过引用Solr Wiki或网络搜索来快速回答,但要获得DocValues的要点:除了实际搜索之外,它们对于与现代搜索服务相关的所有其他内容都很有用.来自 Solr社区Wiki:

DocValues是一种在内部记录字段值的方法,这种方法对某些目的更有效,例如排序和分面,然后是传统的索引.

...

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

这也应该回答为什么Lucene 5需要DocValues进行排序 - 它比以前的方法更有效率.

这样做的原因是,为这些操作收集数据时,存储格式是从标准格式转换的,其中应用程序以前必须通过每个文档来查找值,现在它可以查找值并查找相应的文档代替.当您已经拥有执行交叉点所需的文档列表时,这非常有用.

如果我没记错的话,更新基于DocValue的字段涉及从先前的令牌列表中取出文档,然后将其重新插入到新位置,与先前的方法相比,它改变了依赖项的负载(并且重新索引是唯一可行的策略).

将DocValues用于需要上述任何属性的字段,例如排序/分面/等.

  • 如果是后者,不要浪费你的时间.每个人都知道Apache Solr有文档,如果它使解决方案显而易见,我敢肯定op首先不会问.我在上周一直在阅读Solr的文档,逐页阅读; 除了吃饭和获得8小时之外别无其他,当我看到人们说Solr的文档质量低或者有一些初步的学习阶段难以克服时,我并不感到惊讶; 特别是当它与Sphinx或ElasticSearch进行比较时. (4认同)
  • 我认为,如果不是每次有人问到有关 Solr 的问题时都引用 SolrWiki,而是开发人员花时间思考文档可能存在哪些缺陷,那么一年后我就不会再看这篇文章了,但问题非常相似. (3认同)
  • 谢谢,但这并没有真正回答这个问题.我知道他们在排序方面效率更高......但它并没有解释这种奇怪的行为.如何从文档中检索其值?document.get(fieldname)似乎不起作用,有什么用呢如果我无法访问它? (2认同)
  • 帮助我更好地理解这一点的是这里的博客文章:https://sease.io/2020/03/docvalues-vs-stored-fields-apache-solr-features-and-performance-smackdown.html。 (2认同)