为什么在Elasticsearch中需要“存储”:“是”?

问题描述 投票:63回答:2

我真的不明白为什么在core types link中它在属性描述中说(例如,对于数字):

  1. store-设置为yes以将实际字段存储在索引中,否则不存储它。默认为no(请注意,JSON文档本身已存储,可以从中检索它)]
  2. index-如果不应为该值建立索引,则设置为no。在这种情况下,应该将store设置为yes,因为如果未对它进行索引和存储,则与它无关

这两个大胆的部分似乎矛盾。如果"index":"no", "store":"no",我仍然可以从来源获取值。例如,如果我有一个包含URL的字段,这可能是一个好用法。没有?

我做了一个小实验,我有两个映射,一个字段设置为"store":"yes",另一个字段设置为"store":"no"

在两种情况下,我仍然可以在查询中指定:

{"query":{"match_all":{}}, "fields":["my_test_field"]}

我也得到了相同的答案,返回了字段。

[我以为如果将"store"设置为"no",那意味着我无法检索特定字段,而必须获取整个_source并在客户端进行解析。

那么,将"store"设置为"yes"有什么好处?仅当我从"_source"字段中明确排除该字段时,才有意义吗?

elasticsearch
2个回答
105
投票

我以为,如果将“商店”设置为“否”,那意味着我不能检索特定字段,但必须获取整个_source和在客户端解析它。

这是没有存储字段(默认)并且启用了_source字段(也是默认值)时,elasticsearch为您所做的。

您通常将字段发送给elasticsearch,因为您要在其上搜索或检索它。但是,的确,如果您没有显式存储字段并且没有禁用源,您仍然可以使用_source来检索字段。这意味着在某些情况下,具有未索引或未存储的字段实际上可能有意义。

当您存储字段时,这是在底层lucene中完成的。 Lucene是一个倒排索引,它允许快速的全文本搜索并在给定文本查询的情况下返回文档ID。除了倒排索引之外,Lucene还具有某种类型的存储,可以在其中存储字段值,以便在给定文档ID的情况下进行检索。通常,您要将要返回的字段存储在lucene中作为搜索结果。 Elasticsearch不需要存储要返回的每个字段,因为默认情况下它始终存储您发送给它的每个文档,因此它始终能够返回您发送给它的所有内容作为搜索结果。

仅在少数情况下,将字段显式存储在lucene中可能会很有用:禁用_source字段时,或者当我们希望避免对其进行解析时,即使该解析是由Elasticsearch自动完成的。请记住,尽管从Lucene检索许多存储的字段可能需要每个字段一个磁盘查找,而从Lucene中仅检索_source并解析它以检索所需的字段只是一个磁盘查找,并且在大多数情况下都更快案件。


5
投票

默认情况下,在Elasticsearch中,存储了_source(已被索引的文档)。这意味着当您搜索时,您可以获得实际的文档来源。此外,elasticsearch会自动从fields / objects中提取_source并在您明确要求时返回它们(以及可能在其他组件中使用它,例如突出显示)。

您可以指定还存储特定字段。这意味着该字段的数据将单独存储。这意味着,如果您要求输入field1(已存储),elasticsearch将识别其已存储,并从索引中加载它,而不是从_source中获取它(假设_source已启用)。

您何时要启用存储特定字段?大多数时候,你没有。提取_source的速度很快,提取它的速度也很快。如果您有非常大的文档,其中存储_source的成本或解析_source的成本很高,则可以显式映射要存储的某些字段。

注意,检索每个存储字段会产生成本。因此,例如,如果您有一个json,其中包含10个合理大小的字段,并且将所有字段映射为已存储,并要求所有字段,这意味着要加载每个字段(更多磁盘搜索),而不是仅加载[ C0](这是一个字段,可能已压缩)。

_source

© www.soinside.com 2019 - 2024. All rights reserved.