Проверка, существует ли поле при вложенном поиске эластичного поиска
Пытаясь выполнить запрос 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" : { ... }
}
}
}
}
}
}
Используя это, вы должны быть в состоянии перейти от старого отображения к новому отображению.