Запрашивать разные вложенные объекты из разных документов - PullRequest
0 голосов
/ 17 января 2019

Предположим, у меня есть два документа, структурированных следующим образом (предположим, есть еще много похожих):

    doc1
    {
      "person_name": "foo",
      "food_likes": [
           { "name": "steak",
             "food_type": "meat",
             "extra_field": "field"
           },
           { "name": "chocolate cake",
             "food_type": "dairy",
              "extra_field": "field"
           }
       ]
   }
    doc2
    {
      "person_name": "bar",
      "food_likes": [
           { "name": "carrots",
             "food_type": "vegetable"
             "extra_field": "field"
           },
           { "name": "chocolate cake",
             "food_type": "dairy",
             "extra_field": "field"
           }
       ]
   }

Я хотел бы сделать запрос, который привел бы к следующим двум вложенным документам (игнорируя fields и inner_hits и т. Д.):

  hits: [{ "person_name": "foo",
      "food_likes": [ {
          "name" : "steak",
          "food_type": "meat"}
       ]
     },
     { "person_name": "bar",
      "food_likes": [ {
          "name" : "chocolate cake",
          "food_type": "dairy"}
       ]
     }]

, в котором один вложенный документ был возвращен из каждого документа (из документа 1 я выбрал вложенный объект с name="steak" и вернул только поля name и food_type. Во втором документе я выбрал вложенный объект объект с name="chocolate cake" и возвращает только поля name и food_type.

Я пришел к следующему запросу:

{
 "fields": ["person_name"],

  "query":{
     "bool": {
         "filter":[
            {"terms": {
                 "person_name": ["foo","bar"]
            }},
            {"nested": {
               "path":"food_likes",
               "inner_hits": {
                  "_source":[
                      "name",
                       "food_type"
                   ]
                },
                "query":{
                    "bool":{
                       "filter": [
                          {"terms":{
                              "food_likes.name":["steak", "chocolate cake"]
                           }}
                        ]
                     }
                 }

            }}
          ]

       }
   }
}

Тем не менее, здесь выполняется «декартово произведение», равное ["foo", "bar"] и ["steak", "chocolate cake"]. Таким образом, вложенный объект name="chocolate cake" также будет возвращен с объектом name="steak" в документе 1. Однако я хочу, чтобы steak извлекался из foo, а chocolate cake - из bar.

Возможно ли это в Elastic Search без выполнения нескольких запросов для каждого документа и без изменения структуры документа? Я посмотрел на has_parent, но здесь это, похоже, неприменимо.

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