2013-05-13 121 views
24

两者之间的区别,谁拥有所有的领域,没有我。Elasticsearch中_source和_all之间的区别是什么

如果我的文件有:

{"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”的用例,然后什么功能会被拒绝我?

回答

43

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

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

_source字段旨在存储最初发送给elasticsearch的整个源文档。它被用作搜索结果,被检索。你无法搜索它。实际上它是一个存储在lucene中的字段,并且未被索引。

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

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

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

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

+0

谢谢! 如果我设置一个字段为“索引”:“不”,它仍然出现在“_all”中,对不对? 因此,如果我无意一次对多个指定字段进行全文搜索,那么在所有字段中将“include_in_all”设置为false将节省空间,对吧? – eran 2013-05-13 16:04:28

+1

与此同时,我在回答中增加了更多的想法。 '_all'字段默认设置为'“index”:yes',并且与其他字段的映射无关,如果不使用'include_in_all'选项。如果你不使用'_all'字段,我会完全禁用它,而不是将所有字段设置为''include_in_all“:false'。 – javanna 2013-05-13 16:24:30

+0

谢谢,将禁用'_all'字段保存可观的磁盘空间? (它看起来似乎几乎使需要的空间增加一倍,直观) – eran 2013-05-13 17:39:55