Мы индексируем следующие продукты:
{
"id": "1",
"name": "the-name",
"categories": [
{
"id" : 10,
"name" : "cat-1"
},
{
"id" : 20,
"name" : "cat-2"
}
]
}
Мы выполняем агрегацию на categories.id
, используя:
REQUEST:
//...
"aggs": {
"by_cat": {
"terms": {
"field": "categories.id",
"size": 10
}
}
}
---
RESPONSE:
// ...
"by_cat" : {
"buckets" : [
{
"key" : 10,
"doc_count" : 804
},
{
"key" : 20,
"doc_count" : 327
},
Это работает хорошо, однако, каждое ведро содержит только categories.id
в поле key
. Мы хотели бы иметь возможность иметь название категории в корзине, например:
// ...
"buckets" : [
{
"key" : 10,
"metadata": {
"name": "cat-1"
},
"doc_count" : 804
},
{
"key" : 20,
"metadata": {
"name": "cat-2"
},
"doc_count" : 327
},
Каков хороший способ сделать это? Мы нашли два, чтобы получить эту информацию, но они оба выглядят «hacki sh»:
- Используя top_hits с размером 1 и источником, ограниченным категориями, он будет получать по одному документу на каждую корзину, содержащую необходимую нам информацию , Это первое решение не выглядит с точки зрения производительности, и чем больше у нас агрегации, тем более раздутым является ответ.
- Добавление нового столбца id_name, в котором объединяются id и name, и выполняется термин агрегация для него. Это больше похоже на взлом, и может быть сложным, если много полей.
Мы также пытались смешать поле и скрипт в терминах, но это не помогает.
метаданные выглядели именно так, как мы хотели, но они глобальны для всех сегментов, а не динамичны c.
У нас есть другой способ получить эту информацию?