【发布时间】:2018-12-14 13:52:26
【问题描述】:
我是 Solr 的新手。我读到 Solr 正在使用倒排索引,这对于快速搜索结果非常有效。但如果查询包括排序、分面,人们建议使用 docvalues。所以我的问题是什么是 docvalues 以及为什么我们需要在上述情况下使用,以及在上述情况下反转索引如何无效。 如果可能,请用例子详细说明。
【问题讨论】:
标签: sorting solr inverted-index
我是 Solr 的新手。我读到 Solr 正在使用倒排索引,这对于快速搜索结果非常有效。但如果查询包括排序、分面,人们建议使用 docvalues。所以我的问题是什么是 docvalues 以及为什么我们需要在上述情况下使用,以及在上述情况下反转索引如何无效。 如果可能,请用例子详细说明。
【问题讨论】:
标签: sorting solr inverted-index
为了完成 Hector 的回答,我想说倒排索引可以有效地匹配给定主要搜索查询的文档。
现在,当涉及到过滤/排序/分面时,Solr 作用于结果集,它已经在处理匹配文档的列表,并且任何子查询都将与主结果集相交或联合。
此时,我们可以从逻辑上考虑文档到某物的情况:例如,如果您要按 fieldX 对任意 docID 列表进行排序,您实际上会重新排序 fieldX 值并获取对应的 - sorted - docID。
因此,如果在构建 fieldCache 时为相关字段启用了 docValues,那么准备好使用文档到值的映射将大大提高 fieldCache 的使用率。
我们也可能(可能有些不准确)指的是暖缓存与冷缓存。
【讨论】:
field:value q & fq 匹配的文档 ID 的联合或交集。但是,更复杂的 fq(特别是在使用函数查询时)处理需要在某些时候加载的实际字段值,在这种情况下,为所涉及的字段启用 docValues 是值得的。一个字段既可以被索引也可以使用 docValues。
简短的回答是,DocValues 是一种优化,可帮助提高人们与搜索相关联的 Solr 的一些其他功能的内存利用率和性能。
来自Solr guide:
DocValues 是一种在内部记录字段值的方式 对于某些目的(例如排序和分面)有效,比 传统索引。
为什么是 DocValues?
Solr 构建索引的标准方式是使用倒排索引。 这种风格建立了一个在所有文档中找到的术语列表 索引,每个术语旁边是该术语的文档列表 出现在(以及该术语出现的次数) 文档)。这使得搜索速度非常快 - 因为用户按字词搜索, 拥有一个现成的术语到文档值列表可以进行查询过程 更快。
对于我们现在通常与搜索相关联的其他功能,例如 排序、分面、高亮,这种做法不是很 高效的。例如,分面引擎必须查找每个术语 出现在将构成结果集的每个文档中,并且 拉取文档 ID 以构建构面列表。在 Solr 中,这 保存在内存中,加载速度可能很慢(取决于 文档、条款等的数量)。
在 Lucene 4.0 中,引入了一种新方法。 DocValue 字段现在是 具有在索引处构建的文档到值映射的面向列的字段 时间。这种方法有望减轻一些记忆 fieldCache 的要求并进行分面、排序、 并且分组更快。
【讨论】: