29

掌握所有领域的两者之间的差异使我无法理解。

如果我的文件有:

{"mydoc":
  {"properties":
      {"name":{"type":"string","store":"true"}},
      {"number":{"type":"long","store":"false"}},
      {"title":{"type":"string","include_in_all":"false","store":"true"}}

  }
}

我知道这_source是一个拥有所有领域的领域。但是_all呢?这是否意味着“名称”被保存了多次(两次? in_source和 in _all),从而增加了文档占用的磁盘空间?

“名称”是否为该字段存储一次,为 存储一次,为 存储_source一次_all?那么“数字”呢,它是否存储在 中_all,即使不在_source

我应该什么_source时候在我的查询中使用,什么时候_all

我可以禁用的用例是_all什么,然后会拒绝哪些功能?

4

1 回答 1

50

这与 lucene 中的索引字段和存储字段之间的区别几乎相同。

当您想要搜索索引字段时,您可以使用索引字段,同时存储要作为搜索结果返回的字段。

_source字段旨在存储最初发送到 elasticsearch 的整个源文档。它用作搜索结果,以进行检索。你不能搜索它。实际上它是 lucene 中的一个存储字段并且没有被索引。

_all字段旨在索引来自您的文档组成的所有字段的所有内容。您可以搜索它但永远不会返回它,因为它已编入索引但未存储在 lucene 中。

没有冗余,这两个字段用于不同的用例并存储在 lucene 索引中的不同位置。该_all字段成为我们所谓的倒排索引的一部分,用于索引文本并能够对其执行全文搜索,而该_source字段仅作为 lucene 文档的一部分存储。

您永远不会_source在查询中使用该字段,只有当您返回结果时,因为这是弹性搜索默认返回的内容。有一些功能取决于该_source字段,如果您禁用它,您将失去这些功能。其中之一是更新 API。此外,如果您禁用它,您需要记住store:yes在映射中配置您想要作为搜索结果返回的所有字段。我宁愿说不要禁用它,除非它打扰你,因为它在很多情况下真的很有帮助。另一种常见的用例是当您需要重新索引数据时;您可以从 elasticsearch 本身检索所有文档,然后将它们重新发送到另一个索引。

另一方面,该_all字段只是一个默认的 catch all 字段,当您只想搜索所有可用字段并且不想在查询中指定它们时可以使用该字段。它很方便,但我不会在生产中过分依赖它,最好在不同的字段上运行更复杂的查询,每个字段具有不同的权重。_source如果您不使用它,您可能想要禁用它,在我看来,这将比禁用它产生的影响更小。

于 2013-05-13T16:01:46.083 回答