【问题标题】:lucene Fields vs. DocValueslucene 字段与 DocValues
【发布时间】:2015-05-11 16:14:17
【问题描述】:

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

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

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

其次,我看到在 Lucene 5.0 中改变了一些特性,例如排序只能在 DocValues 上进行……这是为什么呢?

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

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

约瑟夫

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    这些问题中的大多数都可以通过参考 Solr Wiki 或网络搜索来快速回答,但要了解 DocValues 的要点:它们对于与现代搜索服务相关的所有其他内容都很有用,除了实际搜索。来自Solr Community Wiki

    DocValues 是一种在内部记录字段值的方法,在某些用途(例如排序和分面)方面比传统索引更有效。

    ...

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

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

    原因是the storage format is turned around从标准格式收集这些操作的数据时,应用程序以前必须遍历每个文档来查找值,现在它可以查找值并找到相应的文档反而。当您已经拥有需要执行交叉的文档列表时,这非常有用。

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

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

    【讨论】:

    • 谢谢,但这并不能真正回答问题。我知道它们在排序方面效率更高......但这并不能解释奇怪的行为。如何从文档中检索它们的值? document.get(fieldname) 似乎不起作用,如果我无法访问它有什么好处?
    • @YossiVainshtein 它回答了您的大部分问题 - 您的字段是否已存储?只有存储的字段才会返回值; docValues 是一种索引策略,不应影响可检索性。如果您有实际的代码正在尝试开始工作,请包含该问题的最小示例。
    • 如果是后者,就不要浪费时间了。每个人都知道 Apache Solr 有文档,如果它使解决方案显而易见,我敢肯定操作人员一开始就不会问。上周我一直在逐页阅读 Solr 的文档;从字面上看,除了吃饭和获得 8 小时之外什么都不做,当我看到人们说 Solr 的文档质量低下或者有一些难以克服的初始学习阶段时,我并不感到惊讶;尤其是与 Sphinx 或 ElasticSearch 相比时。
    • 我认为,如果不是每次有人提出有关 Solr 的问题时都引用 SolrWiki,而是开发人员花时间考虑文档可能存在的缺陷,我就不会看这篇文章一年多后,遇到了非常相似的问题。
    • 帮助我更好地理解这一点的是这里的博客文章:sease.io/2020/03/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2014-05-17
    相关资源
    最近更新 更多