2015-07-12 3 views
0

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

"_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]: сбой анализа данных [Не удалось разобрать источник »

ответ

0

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

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

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