我没有得到THIS示例,为什么以下两个查询返回12作为结果计数? Post解释说,数据在_all
中的索引方式是不同的。但它并没有解释它。有人可以帮我理解这一点。
GET /_search?q=2014 # 12 results
GET /_search?q=2014-09-15 # 12 results !
答案 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
祝你好运!