Elasticsearch中_source和_all的区别是什么

时间:2013-05-13 15:51:31

标签: elasticsearch

两个拥有所有领域的人之间的差异使我望而却步。

如果我的文件有:

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

  }
}

我知道_source是一个包含所有字段的字段。但_all也是如此? 这是否意味着“名称”被保存了几次(两次?在_src和_all中),增加了文档占用的磁盘空间?

字段的“名称”是一次存储,一次是_source,一次是_all? 关于“数字”,他存储在所有,即使不在_source中?

我应该何时在查询中使用_source,以及_all?

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

1 个答案:

答案 0 :(得分:45)

它与lucene中的索引字段和存储字段之间的差异几乎相同。

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

_source字段用于存储最初发送给elasticsearch的整个源文档。它用作搜索结果,以便检索。你无法搜索它。实际上它是lucene中的存储字段而没有索引。

_all字段用于索引来自文档所包含的所有字段的所有内容。您可以搜索它但从不返回它,因为它已被索引但未存储在lucene中。

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

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

另一方面,_all字段只是一个默认的catch all字段,当您只想搜索所有可用字段并且您不想在查询中全部指定它们时,可以使用该字段。它很方便,但我不会太依赖于生产,在不同的领域运行更复杂的查询,每个都有不同的权重。如果你不使用它,你可能想要禁用它,这比我认为禁用_source的影响要小。