Elasticsearch simple_query_string不支持通配符,而只支持前缀查询,我说得对吗



关于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查询创建一个复杂的搜索包括通配符、跨多个字段的搜索,以及更多虽然查询是通用的,但它是严格的,如果查询字符串包含任何无效语法。

最新更新