弹性搜索_all索引

时间:2016-03-27 17:48:38

标签: elasticsearch

我没有得到THIS示例,为什么以下两个查询返回12作为结果计数? Post解释说,数据在_all中的索引方式是不同的。但它并没有解释它。有人可以帮我理解这一点。

GET /_search?q=2014              # 12 results
GET /_search?q=2014-09-15        # 12 results !

1 个答案:

答案 0 :(得分:3)

假设你有这样的文件: { "name": "John Doe", "occuptation": "Farmer", "favorite_ice_cream": "chocolate" }', { "name": "Jane Doe", "occuptation": "Doctor", "favorite_ice_cream": "vanilla" }'

并且还假设最喜欢的冰淇淋场未经分析。未经分析的字段具有高度可缓存性且易于执行聚合(因此,很容易计算出有多少人喜欢巧克力冰淇淋,例如,与香草相比)。但默认情况下,未分析的字段无法搜索。

但是......默认情况下,Elasticsearch会获取文档中的所有字段,将它们组合成一个_all字段,然后在Lucene中对它们进行分析。因此,对于第一份文件,Elastic将分析字符串" John Doe Farmer巧克力"对于第二个领域,Elasticsearch将分析" Jane Doe Doctor vanilla。"因此,当您提交类似于上述查询的查询时,您可以(例如)搜索GET /_search?q=chocolate并看到John Doe喜欢巧克力冰淇淋。您还可以提交查询字符​​串查询(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html)来搜索_all字段,并仍然找出谁喜欢巧克力。但是,你不能对最喜欢的冰淇淋场使用匹配查询......毕竟,我们告诉Lucene不要分析那个领域。但是,您可以在该字段上使用过滤器并将所有与favorite_ice_cream相等的文档带回巧克力。

一开始就习惯了这种粗糙......但是只要你确保密切关注你正在阅读的哪个版本的文档,那么文档就是好的而不会混淆

另外,如果它有帮助,我喜欢把_all字段想象得像是从监狱免费卡中走出来。很多时候我可能会选择不分析字段,因为我想要在其上运行聚合或应用过滤器。虽然我通常会回想起过滤器需要哪个值,但有时能够将搜索提交到_all字段并确保...这样,例如,如果我无法回想起"国家"领域有"美国"或者"美国和#34;作为美国的价值,我可以快速对_all字段执行查询,查看几个文档,然后选择适当的过滤值。

我使用_all字段的另一种方式是在全文搜索中,我希望在某些字段上提高匹配度,但我还想搜索文档中的所有字段以防万一匹配。针对_all的查询字符串查询在这些情况下效果很好。

您可以在此处详细了解_all字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-all-field.html

希望这足以让你开始......你可能不想按照自己的方式提交简单的查询。可能,您将要提交使用完整查询DSL的POST请求。您可以在此处详细了解:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

祝你好运!