【问题标题】:Using stored_fields for retrieving a subset of the fields in Elastic Search使用 stored_fields 检索 Elastic Search 中的字段子集
【发布时间】:2021-02-02 20:42:04
【问题描述】:

在 ElasticSearch 中使用 stored_fields 功能的文档和建议一直在更改。在最新版本(7.9)中,不推荐使用 stored_fields - https://www.elastic.co/guide/en/elasticsearch/reference/7.9/search-fields.html 这是有原因的吗?

在版本 7.4.0 中,没有这样的负面评论 - https://www.elastic.co/guide/en/elasticsearch/reference/7.4/mapping-store.html

使用此功能的指导是什么?使用 _source 过滤是更好的选择吗?我问是因为在其他一些文档中,_source 过滤应该会降低性能 - https://www.elastic.co/blog/found-optimizing-elasticsearch-searches

如果您使用 _source 或 _fields,您将很快降低性能。他们访问存储的字段数据结构,该结构旨在用于访问结果命中时,而不是在处理数百万个文档时。

使用 Elastic Search 过滤字段而不影响性能的最佳方法是什么?

【问题讨论】:

  • 顺便提一下,那篇博客文章可以追溯到 2014 年,它是永恒的,ES 2.x 甚至还没有发布,所以你是在比较苹果和橘子。
  • @Val 谢谢,我也想提但错过了,再次感谢指出这一点,如果您认为我的回答有帮助,请点赞,如果需要修改,请随时提出建议:)跨度>

标签: elasticsearch elasticsearch-performance


【解决方案1】:

source filtering 是获取字段的推荐方法,您因博客而感到困惑,但您似乎错过了适用的非常重要的概念和用例。 请仔细阅读以下声明。

_source 的目的是在访问结果命中时使用,而不是在处理数百万个文档时使用。

默认情况下,elasticsearch 仅返回 10 个命中/搜索结果,这些结果可以根据 size parameter 进行更改,如果在搜索结果中,您想要获取的字段值比使用 source_filter 更有意义,因为它已经完成了最终结果集(不是所有与搜索结果匹配的文档),

如果您使用脚本,并且使用源值尝试读取字段值并过滤搜索结果,这将导致查询扫描上述语句的第二部分的所有索引(不是在处理时数以百万计的文件。)

除上述之外,由于所有字段值都已存储为默认启用的_source field 的一部分,因此如果您将少数字段显式标记为已存储(默认禁用为保存索引大小)以检索字段值。

【讨论】:

  • 感谢您的回复。如果_source 包含一个json 值很大的字段,排除这个会扼杀查询的性能吗? Elastic Search 是否必须反序列化 _source、排除该字段然后重新序列化响应?
  • 当您想通过_source, 获取一些字段值时,无论如何都必须对数据进行反序列化/序列化,这取决于您要优化的级别,您也可以禁用(_source)如果您有大型 JSON 并且在搜索结果中明确存储了您需要的几个字段,则完全可以。
  • @Arjun 如果您可以投票并接受答案(如果有帮助),那就太好了:)\
  • @Arjun 如果有帮助并解决了您的问题,您可以投票并接受答案,TIA :)
猜你喜欢
  • 2017-05-12
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2021-09-02
  • 2021-03-22
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多