Elastic OR-options 没有像我预期的那样工作
Elastic OR-options its not working as I expected
为什么我要这样做才能根据我的三个术语获得所有结果:
...
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "* AND (name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\")"
}
},
...
而不是
...
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "* AND name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\""
}
},
...
第一个查询 returns 包含 NAME 1、NAME 2 和 NAME 3 的所有文档,但第二个查询 returns 仅包含术语 NAME 1.
另外,returns下面的查询只有NAME 3
...
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\" AND *"
}
},
...
这没有意义,因为如果我使用不存在的术语创建查询,例如:" * AND name: \ "asdfasdfa \" OR name: \ "NAME 2 \" OR name: \ "NAME 3 \" "
,我将得到一个空答案并考虑代码条件:
true && false || true || true
是 true
true && (false || true || true)
也 true
并且,
'a' && null || 'b' || 'c'
是 'b'
'a' && (null || 'b' || 'c')
也 'b'
这是 operands precedence 的主题。引用文档(粗体 自己加的亮点):
The familiar boolean operators AND
, OR
and NOT
(also written &&
, ||
and !) are also supported but beware that they do not honor the usual precedence rules, so parentheses should be used whenever multiple operators are used together.
所以,对于查询#2,原来的:
* AND name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\"
内部转换为lucene查询:
+*:* +name:\"name 1\" name:\"name 2\" name:\"name 3\"
因此,不能理解为:
true && false || true || true
在标准布尔逻辑中,它确实等于 true
。
长话短说,只要适用就使用括号。
顺便说一句,lucene 查询中的术语是 lowercased(被 standard
分析器分析),因为您指定了 analyze_wildcard:true
。这可能正是您想要的,也可能不是您想要的,因此我认为值得一提!
为什么我要这样做才能根据我的三个术语获得所有结果:
...
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "* AND (name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\")"
}
},
...
而不是
...
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "* AND name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\""
}
},
...
第一个查询 returns 包含 NAME 1、NAME 2 和 NAME 3 的所有文档,但第二个查询 returns 仅包含术语 NAME 1.
另外,returns下面的查询只有NAME 3
...
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\" AND *"
}
},
...
这没有意义,因为如果我使用不存在的术语创建查询,例如:" * AND name: \ "asdfasdfa \" OR name: \ "NAME 2 \" OR name: \ "NAME 3 \" "
,我将得到一个空答案并考虑代码条件:
true && false || true || true
是 true
true && (false || true || true)
也 true
并且,
'a' && null || 'b' || 'c'
是 'b'
'a' && (null || 'b' || 'c')
也 'b'
这是 operands precedence 的主题。引用文档(粗体 自己加的亮点):
The familiar boolean operators
AND
,OR
andNOT
(also written&&
,||
and !) are also supported but beware that they do not honor the usual precedence rules, so parentheses should be used whenever multiple operators are used together.
所以,对于查询#2,原来的:
* AND name:\"NAME 1\" OR name:\"NAME 2\" OR name:\"NAME 3\"
内部转换为lucene查询:
+*:* +name:\"name 1\" name:\"name 2\" name:\"name 3\"
因此,不能理解为:
true && false || true || true
在标准布尔逻辑中,它确实等于 true
。
长话短说,只要适用就使用括号。
顺便说一句,lucene 查询中的术语是 lowercased(被 standard
分析器分析),因为您指定了 analyze_wildcard:true
。这可能正是您想要的,也可能不是您想要的,因此我认为值得一提!