Агрегация Elasticsearch с параметром пути reverse_nested
Может ли кто-нибудь подробнее рассказать о параметре "путь" в теге reverse_nested при агрегации asticsearch? Я пытаюсь объединить вложенные корзины, используя ключи на разных уровнях вложенности. Вот подробности:
Создание индекса с последующим отображением
PUT agg
{
"mappings": {
"sample": {
"properties": {
"product": {
"type": "object",
"properties": {
"name": {
"type": "keyword"
},
"category": {
"type": "keyword"
}
}
},
"features": {
"type": "nested",
"properties": {
"color": {
"type": "keyword"
},
"details": {
"type": "text"
},
"finish": {
"type": "keyword"
}
}
}
}
}
}
}
Индексирование некоторых документов в индексе "agg":
POST _bulk
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "1" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"black","details":"jet black in color"},{"finish":"matte"}]}
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "2" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"black","details":"jet black in color"},{"finish":"glossy"}]}
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "3" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"red","details":"apple red in color"},{"finish":"matte"}]}
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "4" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"red","details":"blood red in color"},{"finish":"matte"}]}
Следующая агрегация работает, как и ожидалось: (Ведра цветов содержат ведро отделки):
GET agg/_search
{
"size": 0,
"aggs": {
"root": {
"nested": {
"path": "features"
},
"aggs": {
"colors": {
"terms": {
"field": "features.color",
"size": 10
},
"aggs": {
"colorToFinish": {
"reverse_nested": {},
"aggs": {
"root": {
"nested": {
"path": "features"
},
"aggs": {
"finishes": {
"terms": {
"field": "features.finish",
"size": 10
}
}
}
}
}
}
}
}
}
}
}
}
Тем не менее, следующее не работает должным образом:
GET agg/_search
{
"size": 0,
"aggs": {
"root": {
"nested": {
"path": "features"
},
"aggs": {
"colors": {
"terms": {
"field": "features.color",
"size": 10
},
"aggs": {
"colorToFinish": {
"reverse_nested": {
"path": "features"
},
"aggs": {
"finishes": {
"terms": {
"field": "features.finish",
"size": 10
}
}
}
}
}
}
}
}
}
}
В нерабочем DSL я пытаюсь выйти из "вложенности" в "особенности" и снова углубиться, чтобы получить финиш. Кажется, это не собирает ведра для "финиша".
Однако подход, при котором мы находимся на уровне корневого документа и извлекаем поле из первого принципа, кажется, работает. Таким образом, может показаться, что я не использую параметр "path" в reverse_nested правильно и, возможно, не приземляюсь в правильной вложенности. Кто-нибудь знает, почему второй запрос не работает?
1 ответ
nested
запрос / агрегация позволяет запрашивать / агрегировать вложенные объекты. Вы должны указать path
в который входит запрос / агрегация. reverse_nested
с другой стороны, позволяет вам выпрыгнуть из текущего вложенного запроса / агрегации. когда reverse_nested
используется, он уже знает, из какого вложенного объекта он должен выпрыгнуть, поэтому нет path
требуется внутри reverse_nested
,
Так что в вашем первом запросе, когда reverse_nested
будет представлена следующая агрегация на объекте верхнего уровня, таком как "продукт" и "функции". Теперь вы хотите агрегировать на вложенном поле features.finish, поэтому вам нужно снова войти во вложенный объект, дав nested
срок с path
, И тогда вы делаете обычную агг на вложенном поле features.finish.
Второй запрос не работает по двум причинам: 1. reverse_nested
не поддерживается path
и это не нужно. 2. После reverse_nested
срок, nested
все еще требуется при запросе / агрегировании во вложенном поле.