Как проверить, существуют ли все значения внутри упругого поиска во вложенных объектах - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующий документ в 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": ""
          }
        ]
      }
    ]
  }
]

, и я хочу искать с несколькими field_id и field_value с оператором AND.Но это работает, если есть единственное условие, но не для нескольких случаев.Вот что я пробовал до сих пор:

    {
  "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.Может кто-нибудь помочь построить такой запрос?

Спасибо

1 Ответ

0 голосов
/ 13 декабря 2018

Ниже то, что вы ищете.Вам просто нужно вставить второй уровень, вложенный в два предложения 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), тогда вы увидите только inner_hit для последнего предложения , которое в итоге перезапишет inner_hits результат первого вложенного предложения .

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...