ElasticSearch:在单个查询中查询嵌套数组中的空值和特定值

68de4m5k  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(225)

文件结构-

{
  "hits": [
    {
      "_type": "_doc",
      "_id": "ef0a2c44179a513476b080cc2a585d95",
      "_source": {
        "DIVISION_NUMBER": 44,
        "MATCHES": [
          {
            "MATCH_STATUS": "APPROVED",
            "UPDATED_ON": 1599171303000
          }
        ]
      }
    },
    {
      "_type": "_doc",
      "_id": "ef0a2c44179a513476b080cc2a585d95",
      "_source": {
        "DIVISION_NUMBER": 44,
        "MATCHES": [ ]
      }
    }
  ]
}

问题- MATCHES是一个嵌套数组,其中有一个文本字段MATCH_STATUS,可以有任何值,如“批准”,“拒绝”。我正在寻找搜索包含MATCH_STATUS的所有文档,其值为“批准”,“推荐”以及MATCHES中没有数据(空数组“MATCHES”:[ ]).请注意,我希望在单个查询中执行此操作.

我可以在两个单独的查询中完成此操作,如下所示-

获取状态为“建议”、“已批准”的所有匹配项

"must": [
        {
          "nested": {
            "path": "MATCHES",
            "query": {
              "terms": {
                "MATCHES.MATCH_STATUS.keyword": [
                  "APPROVED",
                  "RECOMMENDED"
                ]
              }
            }
          }
        }
      ]

获取具有空数组“MATCHES”的所有匹配项:[ ]

{
  "size": 5000,
  "query": {
    "bool": {
      "filter": [],
      "must_not": [
        {
          "nested": {
            "path": "MATCHES",
            "query": {
              "exists": {
                "field": "MATCHES"
              }
            }
          }
        }
      ]
    }
  },
  "from": 0
}
voase2hg

voase2hg1#

可以使用should子句合并这两个查询。

{
  "query": {
    "bool": {
      "minimum_should_match": 1, 
      "should": [
        {
          "nested": {
            "path": "MATCHES",
            "query": {
              "bool": {
                "minimum_should_match": 1,
                "should": [
                  {
                    "terms": {
                      "MATCHES.MATCH_STATUS.keyword": [
                        "APPROVED",
                        "RECOMMENDED"
                      ]
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "nested": {
                  "path": "MATCHES",
                  "query": {
                    "bool": {
                      "filter": {
                        "exists": {
                          "field": "MATCHES"
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

**更新:**回答您的意见。

缺少的聚合暂时不支持嵌套字段。到目前为止存在open问题。
要获取空匹配项的计数,可以使用筛选器聚合,并将嵌套查询 Package 到布尔查询的must_not子句中。

{
  "aggs": {
    "missing_matches_agg": {
      "filter": {
        "bool": {
          "must_not": {
            "nested": {
              "query": {
                "match_all": {}
              },
              "path": "MATCHES"
            }
          }
        }
      }
    }
  }
}

相关问题