【问题标题】:Elasticsearch match VS query_stringElasticsearch 匹配 VS query_string
【发布时间】:2018-06-01 03:06:13
【问题描述】:

这是我的测试:

使用匹配

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

0 次点击

然后使用 query_string

{"query":{"bool":{"must":[{"query_string":{"fields":["name"],"query":"*ka*"}},{"term":{ "种类":"k1"}}]}}}

大约 1000+ 次点击
一些名称如“katyperry”、“KathleenLights”等。使用match找不到它们

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

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

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

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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    {"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"}}]}}}
    

    【讨论】:

    • 谢谢!你的解释是如此清晰:D。我使用“通配符”尝试了您的查询,它有效!
    • 所以,“通配符”和“query_string”都适用于我的情况,最好使用哪一个?例如,在性能方面。看来这两个太像了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2018-05-20
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多