我正在使用OpenSearch对数据库中的文档进行查询,目前我正在进行此搜索(我使用default_operator= AND
,“”之间的术语是术语1 4和5是我省略的两个词的术语,即:“foo bar”):"term 1" term2 term3 "term 4" OR "term 5"
个
但是当我看我的结果时,有些文档只有"term 1" term2 term3
。如果我添加括号,这个搜索将返回我想要的结果:("term 1" term2 term3 "term 4") OR ("term 5")
个
在这些查询的结果之间存在差异有意义吗?
我也试着把“term 4”的位置改为:"term 1" "term 4" term2 term3 OR "term 5"
个
结果也与第一个查询的结果不同,对我来说这没有意义。
这是一个几乎完整查询的示例:
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"query_string": {
"query": "\"term 1\" term2 term3 \"term 4\" OR \"term 5\"",
"fields": [
"my_field.analyzed"
],
"default_operator": "AND",
"boost": 0.1
}
},
{
"query_string": {
"query": "\"term 1\" term2 term3 \"term 4\" OR \"term 5\"",
"fields": [
"my_field_2",
"my_field_3"
],
"boost": 0.5
}
}
]
}
},
{
"exists": {
"field": "my_field"
}
}
],
字符串
1条答案
按热度按时间kh212irz1#
值得注意的是,布尔运算符不遵循通常的优先级规则(another example here和some more thoughts here)。
如果您是JavaCC爱好者,您还可以检查compiler definition以获得Lucene的查询字符串解析器。您将看到查询是按顺序解析的,即除了正确指定括号外,没有您所期望的优先级。
从最后一个链接中得到的主要启示是,您需要从OPTIONAL,REQUIRED(即,
+
)和禁止(即-
)的数据使用Validate API,您可以看到在Lucene端执行了什么。例如,下面的第一个查询
字符串
执行为
型
所以
term 1
为必填项term2 term3
(两者连接在一起)是必需的term 4
和term 5
是可选的关于第二个查询,
型
它被执行为
型
于是:
term 1
必须存在于my_field_2
或my_field_3
中term2 term3
必须存在于my_field_2
或my_field_3
中term 4
可以存在于my_field_2
或my_field_3
中term 5
可以存在于my_field_2
或my_field_3
中+
)