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 es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard