按预期工作:
{
"query": {
"query_string": {
"query": "Hofstetten-Grünau"
}
}
}
最后添加的通配符没有结果,我想知道原因:
{
"query": {
"query_string": {
"query": "Hofstetten-Grünau*"
}
}
}
如何解决?
elasticsearch v5.3.2
这会带来结果:
{
"query": {
"query_string": {
"query": "Hofstetten*"
}
}
}
我使用单个搜索字段。最终用户可以根据需要自由使用通配符。用户可以键入:
所以使用匹配查询对我来说不会有用。
我使用Jest(Java Annotations)作为Mapping,并使用“default”作为此字段。我的索引映射声明该字段没什么特别的:
{
"mappings": {
"_default_": {
"date_detection": false,
"dynamic_templates": [{
}]
}
}
}
答案 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
)。