如果doc值用于elasticsearch中的字段,那么存储该字段是多余的吗?

时间:2014-06-26 21:51:59

标签: java lucene elasticsearch

据我了解,在elasticsearch中存储一个字段有两个目的:

  1. 可以直接从磁盘检索字段,而无需解析_source。例如,使用字段查询时会发生这种情况。
  2. 如果禁用_source,则存储的字段将构成返回的文档。
  3. 但是,存储一个字段会占用额外的磁盘空间,并且有理由在弹性搜索中保留_source,因此对于较大的文档来说,这可能是值得的。

    同样,doc值存储可以按文档查找的字段。似乎这些字段按字段而不是按文档聚集在磁盘上,这使得从不同文档(排序,聚合等)检索大量相同字段的效率更高。这样做不是为了那些操作而缓存内存中的所有存储字段。

    我的问题是......如果您有doc值,是否仍然存在用于存储字段的有效用例,如果有,那么它是什么?

    最终,我正在尝试确定doc_values合适的字段的正确映射。

2 个答案:

答案 0 :(得分:1)

我不知道如果没有存储该字段但是它已为其启用了docValues,elasticsearch是否会为您检索字段值。我可以告诉你的是,尽管docValues习惯于表示以柱状方式存储的字段(正如您所指出的那样,使得排序甚至函数查询所需的批量检索更容易),lucene将docValues视为单独的字段本身。

因此,在弹性搜索中,您在字段foo上启用docvalues并最终获得相同的重复数据,lucene下面将为每个文档创建一个docValues字段,并从{{1}复制数据}字段到它。因此实际上并不能保证在lucene级别数据是重复的,但在弹性搜索级别有一个。

简而言之,您可以实施此功能(如果尚未实施)

答案 1 :(得分:0)

这是一个较晚的答案,但将来可能会对某人有所帮助。

doc值

doc_values以面向列的方式建立索引,并用于提高排序,聚合和脚本访问的性能。您可以通过在查询中指定docvalue_fields来获取文档值。

对于支持此功能的那些字段,默认情况下启用doc_values。但是,分析的字符串字段不支持doc_values。因此,如果该字段的类型为 text ,则无法获取该字段的doc值。

商店

store参数用于存储字段值。这样我们就可以避免通过在查询中指定stored_fields来解析 _source 以获得字段值。 AFAIK,您可以存储任何类型的字段。

但是,此功能会占用额外的磁盘空间,因此默认情况下处于禁用状态。如果 _source 不是一个庞大的文档,通常您无需启用此功能。

fielddata

fielddata用于文本类型的字段。如上所述,文本字段不支持doc值。相反,当您想要获取字段值(通过在查询中指定docvalue_fields)或对文本字段进行汇总时,ElasticSearch将从磁盘加载反转索引,反转term-doc关系,并缓存结果在记忆中。这样我们就可以获取字段值。

但是,这并不是一个便宜的操作,并且可能会占用大量内存。因此,默认情况下禁用此功能。而且您应该谨慎使用!!!

  

我的问题是...如果您有doc值,是否仍然有一个有效的用例来存储字段,如果有,那是什么?

是。如果 _source 被禁用,并且您仍想获取文本字段的值,则需要存储它。由于 fielddata 可能不是一个好主意。