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

时间:2018-12-13 10:08:10

标签: node.js elasticsearch elasticsearch-5

我在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"
    }
  }
}

如果在ticket_group内的field_values对象中存在值为“ amit”的field_id = 717和值为“ kumar”的field_id = 589,我想搜索故障单组。使用上面的查询时,在field_values中同时存在两个值的对象时,我没有任何记录。 任何人都可以帮助建立这样的查询吗?

谢谢

1 个答案:

答案 0 :(得分:2)

以下是您要寻找的。您只需要将嵌套的第二级推入两个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命名。

如果您不这样做(尝试通过删除name中的inner_hits键),则只会看到 last子句的inner_hit 最终覆盖了第一个嵌套子句inner_hits结果。

希望这会有所帮助!