Проверка, существует ли поле при вложенном поиске эластичного поиска

Пытаясь выполнить запрос ES, я столкнулся с проблемой при попытке выполнить вложенную фильтрацию объектов в массиве. Наша структура данных изменилась:

 "_index": "events_2015-07-08",
 "_type": "my_type",
 "_source":{
    ...
    ...
    "custom_data":{
        "className:"....."
    }
 }

чтобы:

 "_index": "events_2015-07-08",
 "_type": "my_type",
 "_source":{
    ...
    ...
    "custom_data":[   //THIS CHANGED FROM AN OBJECT TO AN ARRAY OF OBJECTS
        {
          "key":".....",
         "val":"....."
        },
        {
          "key":".....",
         "val":"....."
        }
    ]
 }

этот вложенный фильтр отлично работает с индексами, имеющими новую структуру данных:

{
     "nested": { 
         "path": "custom_data",
         "filter": {
             "bool": {
                 "must": [                                
                    {
                        "term": 
                            {
                             "custom_data.key": "className"
                            }
                    }, 
                    {
                         "term": {
                             "custom_data.val": "SOME_VALUE"
                         }
                     }
                  ]
              }
          },
          "_cache": true   
      }
 }

Однако происходит сбой при просмотре индексов, которые имеют более старую структуру данных, поэтому эту функцию нельзя добавить. В идеале я бы смог найти обе структуры данных, но на этом этапе я бы согласился на "изящный сбой", то есть просто не возвращал результаты, если структура старая.

Я попытался добавить фильтр "существует" в поле "custom_data.key", и "существует" внутри "не" в поле "custom_data.className", но я получаю "SearchParseException" [[events_2015-07-01][0]: из [-1], размер [-1]: ошибка синтаксического анализа [не удалось проанализировать источник "

1 ответ

Есть indices фильтр (и запрос), который можно использовать для выполнения условных фильтров (и запросов) на основе индекса, с которым он работает.

{
  "query" : {
    "filtered" : {
      "filter" : {
        "indices" : {
          "indices" : ["old-index-1", "old-index-2"],
          "filter" : {
            "term" : {
              "className" : "SOME_VALUE"
            }
          },
          "no_match_filter" : {
            "nested" : { ... }
          }
        }
      }
    }
  }
}

Используя это, вы должны быть в состоянии перейти от старого отображения к новому отображению.

Другие вопросы по тегам