Elasticsearch匹配VS query_string

时间:2018-05-31 15:53:01

标签: 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搜索电子邮件时,让我更加怀疑的另一个例子是

{"query": {"bool": {"must": [{ "match":{"email":"testname@gmail.com"}}]}}}

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

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

1 个答案:

答案 0 :(得分:1)

您的第一个查询没有返回结果,因为您没有使用通配符搜索,即使您想要也不会这样,因为"匹配"不支持通配符。 :)请改用:

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

您的上一个查询会返回这些结果,因为您将电子邮件另存为分析字符串,而标准分析器会在空格和标点符号上拆分字符串。当你索引"你好,世界"这是一件好事。能够匹配"你好"和"世界"。但它也意味着" testname@gmail.com"被视为三个单词 - " testname"," gmail"和" com"。

解决此问题需要定义"电子邮件"成为映射中的非分析字符串。除非您使用v5.0或更高版本,否则在这种情况下 - 好消息!你已经拥有一个"关键字"未分析的字段,以下查询将神奇地适合您:

{"query": {"bool": {"must": [{ "match":{"email.keyword":"testname@gmail.com"}}]}}}