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

时间:2018-05-30 13:53:01

标签: elasticsearch elasticsearch-5

按预期工作:

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

最后添加的通配符没有结果,我想知道原因:

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

如何解决?

elasticsearch v5.3.2

这会带来结果:

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

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

  • hofstettengrünau
  • + ORT:霍夫施特滕 - 格吕瑙
  • + ORT:Hofstetten-G *

所以使用匹配查询对我来说不会有用。

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

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

1 个答案:

答案 0 :(得分:0)

在查询字符串的末尾添加通配符“*”会导致查询分析器将“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)。