elasticsearch 使用括号时,OpenSearch返回不同的结果

5w9g7ksd  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(100)

我正在使用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"
          }
        }
      ],

字符串

kh212irz

kh212irz1#

值得注意的是,布尔运算符不遵循通常的优先级规则(another example heresome more thoughts here)。
如果您是JavaCC爱好者,您还可以检查compiler definition以获得Lucene的查询字符串解析器。您将看到查询是按顺序解析的,即除了正确指定括号外,没有您所期望的优先级。
从最后一个链接中得到的主要启示是,您需要从OPTIONAL,REQUIRED(即,+)和禁止(即-)的数据
使用Validate API,您可以看到在Lucene端执行了什么。例如,下面的第一个查询

{
            "query_string": {
              "query": "\"term 1\" term2 term3 \"term 4\" OR \"term 5\"",
              "fields": [
                "my_field.analyzed"
              ],
              "default_operator": "AND",
              "boost": 0.1
            }
          },

字符串
执行为

(
  +my_field.analyzed:term 1 
  +my_field.analyzed:term2 term3 
  my_field.analyzed:term 4 
  my_field.analyzed:term 5
)^0.1


所以

  • term 1为必填项
  • term2 term3(两者连接在一起)是必需的
  • term 4term 5是可选的

关于第二个查询,

{
            "query_string": {
              "query": "\"term 1\" term2 term3 \"term 4\" OR \"term 5\"",
              "fields": [
                "my_field_2",
                "my_field_3"
              ],
              "boost": 0.5
            }
          }


它被执行为

+(
  +(my_field_2:term 1 | my_field_3:term 1)
  +(my_field_2:term2 term3 | my_field_3:term2 term3) 
  (my_field_2:term 4 | my_field_3:term 4) 
  (my_field_2:term 5 | my_field_3:term 5)
)^0.1


于是:

  • term 1必须存在于my_field_2my_field_3
  • term2 term3必须存在于my_field_2my_field_3
  • term 4可以存在于my_field_2my_field_3
  • term 5可以存在于my_field_2my_field_3
  • 上述中的至少一个必须匹配(即,最初的+

相关问题