创建复合AND-OR查询需要什么Elasticsearch DSL?

egmofgnx  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(133)

我必须道歉,如果这是相当琐碎的,但我是相当新的ElasticSearch(8.5)的世界和斗争有点找到一个合适的解决方案,从文档。
最终,目标是创建一个DSL来表示:

(attr1 IS NOT NULL AND attr2 IS NULL) 
  OR (attr3 IS NOT NULL AND attr4 IS NULL) 
  OR attr5 = true

我开始沿着得分的道路,但不能得到一致的结果。
如有任何建议,我们将不胜感激。

rqcrx0a6

rqcrx0a61#

你可以使用下面的DSL查询:
这里,我把所有的3x 1 m0n1x条件放入should子句,把所有的内部AND条件放入bool子句。
exists查询位于must内,用于检查非空值; exists查询位于must_not内,用于检查空值。
请注意,仅当文档中没有字段或字段设置为空时,使用must_not进行exists查询才有效如果字段具有空字符串值,则该查询无效

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "exists": {
                  "field": "attr1"
                }
              }
            ],
            "must_not": [
              {
                "exists": {
                  "field": "attr2"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "exists": {
                  "field": "attr3"
                }
              }
            ],
            "must_not": [
              {
                "exists": {
                  "field": "attr4"
                }
              }
            ]
          }
        },
        {
          "term": {
            "attr5": {
              "value": true
            }
          }
        }
      ]
    }
  }
}

相关问题