ElasticSearch:如何使用多个滤镜过滤对象数组?

v8wbuo2f  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(154)
{
  "id": 9,
  "resolutions": [
    {
      "divisionId": 8
    }
  ]
},
{
  "id": 123,
  "resolutions": [
    {
      "employeeId": 1,
      "divisionId": 5
    },
    {
      "divisionId": 7
    }
  ]
}

索引由document对象组成,每个document都有一个包含对象的数组resolutionsresolution既可以给雇员,也可以给部门。雇员将同时有divisionIdemployeeId,但部门将只有divisionId。我只需要筛选部门。

{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "should": [
                    {
                      "bool": {
                        "must": [
                          {
                            "nested": {
                              "path": "resolutions",
                              "query": {
                                "terms": {
                                  "resolutions.divisionId": [
                                    660
                                  ]
                                }
                              }
                            }
                          }
                        ],
                        "boost": 1
                      }
                    },
                    {
                      "bool": {
                        "must_not": [
                          {
                            "nested": {
                              "path": "resolutions",
                              "query": {
                                "exists": {
                                  "field": "resolutions.employeeId"
                                }
                              }
                            }
                          }
                        ],
                        "boost": 1
                      }
                    }
                  ],
                  "minimum_should_match": 2,
                  "boost": 1
                }
              }
            ],
            "boost": 1
          }
        }
      ],
      "boost": 1
    }
  }
}

问题是这个查询检查解析数组中的所有对象,所以如果只向数组中添加一个部门,我会得到结果,但是如果我还添加了一个雇员,我就不会得到结果。
如果数组中至少存在一个除法,而不管其他对象是什么,如何修复此问题以返回结果?

smtd7mpg

smtd7mpg1#

您的查询相当复杂。
下面将回答our查询
如果数组中至少存在一个分区,而不管其他对象是什么?

查询

{
  "query": {
    "nested": {
      "path": "resolutions",
      "query": {
        "bool": {
          "must_not": [
            {
              "exists": {
                "field": "resolutions.employeeId"
              }
            }
          ],
          "filter": [
            {
              "exists": {
                "field": "resolutions.divisionId"
              }
            }
          ]
        }
      }
    }
  }
}

如果要筛选某些值,可以用查询条件替换筛选器中现有条件
如果要查找匹配的嵌套文档,请使用inner_hits

相关问题