Elasticsearch中_source和_all的区别是什么

era*_*ran 26 elasticsearch

拥有所有领域的两者之间的差异使我望而却步.

如果我的文件有:

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

  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

jav*_*nna 46

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

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

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

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

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

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

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

  • @Fei `_all` 有自己的分析器,当然它默认被索引,但它不使用词干。它对索引到其中的所有部分使用相同的标准分析器。 (2认同)