匹配嵌套数组中的多个项- Elasticsearch

f87krz0w  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(129)

我在我的ElasticSearch服务中存储了类似于以下内容的文档:

[
    {
     "first_name": "John",
     "last_name": 'Dow',
     "statuses": [
        {
            "name": "STAT1",
            "start_date":"2022-10-21T21:03:06", 
            "happy": false
        },
        {
            "name": "STAT2",
            "start_date":"2022-10-21T21:03:06", 
            "happy": true
        },
   
     ]
 }
...
]

我的UI中有一个组件,用户可以在其中选择所需的过滤器,以应用于数据。
first_name == "John" & last_name== 'Doe'
在用户选择了所需的过滤器后,我将创建一个类似于以下内容的查询:

"query": {
    "bool": {
        "must": [
            {
                 "regexp": {
                     "first_name": {
                        "value": ".*John.*"
                      }
                  },
                   "regexp": {
                     "last_name": {
                        "value": ".*Doe.*"
                      }
                  },
            }
        ],
        "should": []
    }
}

现在我有一个新的要求,我需要允许过滤文档如下:
显示文档,其中:

statuses.name === STAT1 & statuses.happy === false

and 

statuses.name === STAT2 & statuses.happy === true

and

first_name === Jhon

我没有找到任何例子如何达到这一要求,任何帮助将不胜感激

ozxc1zmp

ozxc1zmp1#

您可以从这个查询开始。阅读更多关于nested queries的信息。

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "first_name": "john"
          }
        }
      ],
      "filter": [
        {
          "nested": {
            "path": "statuses",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "statuses.name": "STAT1"
                    }
                  },
                  {
                    "term": {
                      "statuses.happy": {
                        "value": "false"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "statuses",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "statuses.name": "STAT2"
                    }
                  },
                  {
                    "term": {
                      "statuses.happy": {
                        "value": "true"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

相关问题