【问题标题】:ElasticSearch: Query nested array for empty and specific value in single queryElasticSearch:在单个查询中查询嵌套数组以获取空值和特定值
【发布时间】:2022-10-23 14:14:14
【问题描述】:

文件结构-

{
  "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,可以有任何值,比如“APPROVED”、“REJECTED”。 我正在寻找包含 MATCH_STATUS 的所有文档,这些文档的值为“APPROVED”、“RECOMMENDED”以及 MATCHES 中没有数据的地方(空数组“MATCHES”:[])。请注意我希望在一个查询中.

我可以在这样的两个单独的查询中做到这一点 -

获取所有状态 = 推荐、已批准的匹配项

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

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

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

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl elasticsearch-7


    【解决方案1】:

    您可以使用 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 问题。

    要获得空匹配的计数,您可以使用过滤器聚合,并将嵌套查询包装到 bool 查询的 must_not 子句中。

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

    【讨论】:

    • 上面的查询有效 **QUESTION ** 在上面的答案中,我还想要一个 MATCHES 嵌套数组为空的文档计数,例如“MATCHES”:[] 我尝试了不同的聚合方式(解决方法),但这些都没有给出正确的结果"aggs": { "sku": { "nested": { "path": "MATCHES" }, "aggs": { "empty-match-agg1": { "missing": { "field": "MATCHES" } }, "empty-match-agg2": { "terms": { "field": "MATCHES", "missing": "N/A" } }}
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多