如何检查嵌套对象弹性搜索中是否存在所有值

How to check if all values exists inside nested object elastic search

我在 ES 中有以下文档:

[
  {
    "event_id": 123,
    "event_name": "test event",
    "event_date": "2018-12-21",
    "ticket_group": [
      {
        "available": 8,
        "price": 8,
        "id": "159831",
        "parking_passes_available": 0,
        "field_values": [
          {
            "field_id": 589,
            "field_value": "KUMAR"
          },
          {
            "field_id": 717,
            "field_value": "AMIT"
          },
          {
            "field_id": 1360,
            "field_value": "SAM"
          },
          {
            "field_id": 2239,
            "field_value": ""
          },
          {
            "field_id": 2240,
            "field_value": ""
          },
          {
            "field_id": 2241,
            "field_value": ""
          },
          {
            "field_id": 2242,
            "field_value": ""
          }
        ]
      }
    ]
  }
]

并且我想使用 AND 运算符搜索多个 field_id 和 field_value。但是如果只有一个条件而不适用于多个情况,它就可以工作。这是我到目前为止尝试过的:

    {
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "ticket_group",
            "score_mode": "max",
            "inner_hits": {
              "from": 0,
              "size": 10000
            },
            "query": {
              "bool": {
                "must": [
                  {
                    "nested": {
                      "path": "ticket_group.field_values",
                      "score_mode": "max",
                      "inner_hits": {
                        "from": 0,
                        "size": 10000
                      },
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "bool": {
                                "must": [
                                  {
                                    "match": {
                                      "ticket_group.field_values.field_id": 589
                                    }
                                  },
                                  {
                                    "match": {
                                      "ticket_group.field_values.field_value": "KUMAR"
                                    }
                                  }
                                ]
                              }
                            },
                            {
                              "bool": {
                                "must": [
                                  {
                                    "match": {
                                      "ticket_group.field_values.field_id": 717
                                    }
                                  },
                                 {
                                    "match": {
                                      "ticket_group.field_values.field_value": "AMIT"
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "size": 10,
  "from": 0,
  "sort": {
    "event_date": {
      "order": "asc"
    }
  }
}

如果 field_id=717 值 "amit" 和 field_id=589 值 "kumar" 存在于 field_values 对象中,我想搜索票组ticket_group 里面。使用上面的查询我没有得到任何记录,而 field_values 中存在具有两个值的对象。 任何人都可以帮助建立这样的查询吗?

谢谢

以下是您要查找的内容。您只需将第二层嵌套到两个 must 子句中。

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "nested":{  
                  "path":"ticket_group",
                  "score_mode":"max",
                  "inner_hits":{  

                  },
                  "query":{  
                     "bool":{  
                        "must":[  
                           {  
                              "nested":{  
                                 "path":"ticket_group.field_values",
                                 "score_mode":"max",
                                 "inner_hits":{  
                                    "name":"inner_clause_1"
                                 },
                                 "query":{  
                                    "bool":{  
                                       "must":[  
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_id":589
                                             }
                                          },
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_value":"KUMAR"
                                             }
                                          }
                                       ]
                                    }
                                 }
                              }
                           },
                           {  
                              "nested":{  
                                 "path":"ticket_group.field_values",
                                 "score_mode":"max",
                                 "inner_hits":{  
                                    "name":"inner_clause_2"
                                 },
                                 "query":{  
                                    "bool":{  
                                       "must":[  
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_id":717
                                             }
                                          },
                                          {  
                                             "match":{  
                                                "ticket_group.field_values.field_value":"AMIT"
                                             }
                                          }
                                       ]
                                    }
                                 }
                              }
                           }
                        ]
                     }
                  }
               }
            }
         ]
      }
   }
}

请注意,我在 二级嵌套 查询中命名了 inner_hits

如果你不这样做(尝试删除 inner_hits 中的 name 键),那么你只会看到 inner_hit最后一个子句 最终覆盖 第一个嵌套子句 .

inner_hits 结果

希望对您有所帮助!