关于stackoverflow有很多相关的问题,但它们大多建议使用其他方法来使用通配符。我正在尝试分析现有的安装,所以替代方案没有用处。
我认为我遇到的问题是simple_query_string和通配符查询对infix*的作用不同。
查询
r*g
扩展为"+msg:r+msg:g"带有simple_query_string:
GET /test/_validate/query?rewrite=true
{
"query": {
"simple_query_string" : {
"query": "r*g",
"fields": ["msg"],
"default_operator": "AND"
}
}
}
返回
{
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"valid": true,
"explanations": [
{
"index": "test",
"valid": true,
"explanation": "+msg:r +msg:g"
}
]
}
这表明简单的查询字符串根本没有将其作为通配符。甚至对r来说都不是*因此,它将不匹配";"运行";,例如
另一方面,通配符查询确实处理中缀。
GET /test/_validate/query?rewrite=true
{
"query": {
"wildcard": {
"msg": {
"value": "r*g",
"case_insensitive": true
}
}
}
}
返回
{
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"valid": true,
"explanations": [
{
"index": "test",
"valid": true,
"explanation": """msg:AutomatonQuery {
org.apache.lucene.util.automaton.Automaton@78b3b2e7}"""
}
]
}
虽然自动机查询可以使用更好的输出,但是作为通配符查询的r*g将匹配"0";"运行";,但是简单的query_string不会。
那么,对于simple_query_string和通配符查询,示例查询字符串匹配非常不同的集合,我正确吗?
simple_query_string
只支持查询字符串末尾的通配符。
术语末尾的
*
表示前缀查询
您可以在文档中看到下一行,因此在您的场景中会忽略*
。
simple_query_string query
不会为无效返回错误语法。相反,它会忽略查询字符串中的任何无效部分。
您可以使用查询的query_string
,但它是严格的,并验证查询语法。
您可以使用query_string查询创建一个复杂的搜索包括通配符、跨多个字段的搜索,以及更多虽然查询是通用的,但它是严格的,如果查询字符串包含任何无效语法。