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 1NAME 2NAME 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 || truetrue

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。这可能正是您想要的,也可能不是您想要的,因此我认为值得一提!