elasticsearch - Elasticsearch匹配VS query_string

标签 elasticsearch

这是我的测试:

使用比赛

{“query”:{“bool”:{“must”:[{“match”:{“name”:{“query”:“ka”}}}},{“term”:{“kind”:“k1 “}}]}}}

0次

然后使用query_string

{“query”:{“bool”:{“must”:[{“query_string”:{“fields”:[“name”],“query”:“* ka *”}}},{“term”:{ “kind”:“k1”}}]}}}


约1000多个点击
一些名称,例如“katyperry”,“KathleenLights”等。使用match找不到它们

另外,让我更加怀疑的另一个示例是,当我使用match搜索电子邮件时

{“查询”:{“ bool(boolean) ”:{“必须”:[{“匹配”:{“电子邮件”:“testname@gmail.com”}}]}}}}

ES返回包含“gmail.com”的所有电子邮件

那么在这些情况下“匹配”如何工作?

最佳答案

您的第一个查询没有返回任何结果,因为您没有使用通配符搜索,即使您不想这样做也没有,因为“match”不支持通配符。 :)使用它代替:

{"query":{"bool":{"must":[{"wildcard":{"name":"*ka*"}},{"term":{"kind":"k1"}}]}}}

您的最后一个查询返回这些结果,因为您将电子邮件另存为已分析的字符串,并且标准分析器将字符串拆分为空白和标点符号。当您索引“hello,world”并且能够在“hello”和“world”上匹配时,这是一件好事。但这也意味着将“testname@gmail.com”视为三个单词-“testname”,“gmail”和“com”。

要解决此问题,需要将“电子邮件”定义为映射中未经分析的字符串。除非您使用的是v5.0或更高版本,否则在这种情况下-好消息!您已经有一个未经分析的“关键字”字段,以下查询将非常适合您:
{"query": {"bool": {"must": [{ "match":{"email.keyword":"testname@gmail.com"}}]}}}

关于elasticsearch - Elasticsearch匹配VS query_string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50628290/

相关文章:

java - ElasticSearch:查询点分隔单词的部分

elasticsearch - 提高查询或映射中的值

php - 使用Elastica进行全文查询

elasticsearch - Django Haystack 通过 Elasticsearch 后端按距离排序,而不是 geo_point 字段错误

elasticsearch - 如何在Elasticsearch中减少请求主体

elasticsearch - 在Elasticsearch中增加特定文档中的特定单词

elasticsearch - 为什么es通过查询删除会删除更多记录

elasticsearch - Liferay 中的 Elasticsearch 实现是开源的吗?

elasticsearch - ElasticSearch在搜索结果的末尾附加不匹配的文档

elasticsearch - Elasticsearch范围查询对象列表