elasticsearch添加了通配符失败的查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch添加了通配符失败的查询相关的知识,希望对你有一定的参考价值。

按预期工作:

{
  "query": {
        "query_string": {
            "query": "Hofstetten-Grünau"
        }
    }
}

最后添加的通配符没有结果,我想知道为什么:

{
  "query": {
        "query_string": {
            "query": "Hofstetten-Grünau*"
        }
    }
}

怎么解决?

elasticsearch v5.3.2

这提供了结果:

{
  "query": {
        "query_string": {
            "query": "Hofstetten*"
        }
    }
}

我使用单个搜索字段。最终用户可以根据需要自由使用通配符。用户可能输入:

  • hofstetten绿色
  • +地点:霍夫施特滕 - 格吕瑙
  • +地点:Hofstetten-G *

所以使用匹配查询不会为我工作。

我使用Jest(Java Annotations)作为Mapping,并使用“default”作为此字段。我的索引映射声明该字段没什么特别之处:

{
    "mappings": {
        "_default_": {
            "date_detection": false,
            "dynamic_templates": [{
            }]
        }
    }
}
答案

在查询字符串末尾添加通配符“*”会导致查询分析器将“Hofstetten”和“Grünau”之间的短划线解释为逻辑NOT运算符。所以你实际上是在搜索包含Hofstetten但不包含Grünau的文档。

您可以通过执行以下搜索变体来验证这一点:

"query": "Hofstetten-XXXXX" #should not return results
"query": "Hofstetten-XXXXX*" #should return results

要解决这个问题,我建议使用match查询而不是query_string查询:

{"query": {"match": { "city": "Hofstetten-Grünau" }}}'

(无论你的适当的字段名称代替city)。

以上是关于elasticsearch添加了通配符失败的查询的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch上的短语和通配符查询

Elasticsearch es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard

Lucene/kibana查询 语法

具有模糊性的 Elasticsearch 通配符查询字符串

Elasticsearches 模糊查询导致Elasticsearch服务宕机

elasticsearch通配符和正则表达式查询