【问题标题】:Elastic OR-options its not working as I expectedElastic OR-options 它没有像我预期的那样工作
【发布时间】:2021-04-15 18:19:19
【问题描述】:

为什么要根据我的三个条件来获得所有结果:

...
"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\""
    }
  },
...

第一个查询返回所有具有 NAME 1NAME 2NAME 3 的文档,但第二个查询仅返回具有术语NAME 1

此外,下面的查询仅返回 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'

【问题讨论】:

    标签: elasticsearch lucene elasticsearch-query


    【解决方案1】:

    这是operands precedence的话题。引用文档(我自己添加的粗体突出显示):

    还支持熟悉的布尔运算符ANDORNOT(也写成&&|| 和!)但要注意它们不遵守通常的优先规则,所以多个运算符一起使用时应使用括号

    所以,在查询#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。这可能是也可能不是你想要的,所以我认为值得一提!

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 2013-04-11
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2023-01-01
      • 2014-06-28
      相关资源
      最近更新 更多