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

问题描述 投票:0回答:1

按预期工作:

{
  "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": [{
            }]
        }
    }
}
elasticsearch elasticsearch-5
1个回答
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)。

© www.soinside.com 2019 - 2024. All rights reserved.