两个拥有所有领域的人之间的差异使我望而却步。
如果我的文件有:
{"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”的用例是什么,然后会拒绝哪些功能?
答案 0 :(得分:45)
它与lucene中的索引字段和存储字段之间的差异几乎相同。
当您想要搜索索引字段时,可以使用索引字段,同时存储要作为搜索结果返回的字段。
_source
字段用于存储最初发送给elasticsearch的整个源文档。它用作搜索结果,以便检索。你无法搜索它。实际上它是lucene中的存储字段而没有索引。
_all
字段用于索引来自文档所包含的所有字段的所有内容。您可以搜索它但从不返回它,因为它已被索引但未存储在lucene中。
没有冗余,这两个字段用于不同的用例并存储在lucene索引中的不同位置。 _all
字段成为我们称之为倒排索引的一部分,用于索引文本并能够对其执行全文搜索,而_source
字段仅作为lucene文档的一部分存储
您的查询中永远不会使用_source
字段,只有当您收到结果时才会这样,因为这是elasticsearch默认返回的内容。有一些功能取决于_source
字段,如果禁用它,则会丢失。其中一个是update API。此外,如果您禁用它,则需要记住在映射中将所有要返回的字段配置为store:yes
作为搜索结果。我宁愿说不要禁用它,除非它困扰你,因为它在很多情况下真的很有帮助。另一个常见用例是当您需要重新索引数据时;您可以从elasticsearch本身检索所有文档,然后将它们重新发送到另一个索引。
另一方面,_all
字段只是一个默认的catch all字段,当您只想搜索所有可用字段并且您不想在查询中全部指定它们时,可以使用该字段。它很方便,但我不会太依赖于生产,在不同的领域运行更复杂的查询,每个都有不同的权重。如果你不使用它,你可能想要禁用它,这比我认为禁用_source
的影响要小。