Я пытаюсь найти связанные теги с тем, который просматривается в данный момент. Каждый документ в нашем индексе отмечен. Каждый тег состоит из двух частей: идентификатора и текстового имени:
{
...
meta: {
...
tags: [
{
id: 123,
name: 'Biscuits'
},
{
id: 456,
name: 'Cakes'
},
{
id: 789,
name: 'Breads'
}
]
}
}
Чтобы получить связанные теги, я просто запрашиваю документы и получаю совокупность их тегов:
{
"query": {
"bool": {
"must": [
{
"match": {
"item.meta.tags.id": "123"
}
},
{
...
}
]
}
},
"aggs": {
"baked_goods": {
"terms": {
"field": "item.meta.tags.id",
"min_doc_count": 2
}
}
}
}
Это отлично работает, я получаю результаты, которые я хочу. Однако мне требуется как идентификатор тега, так и имя, чтобы сделать что-нибудь полезное. Я изучил, как это сделать, решения выглядят так:
- Объединить поля при индексировании
- A script, чтобы объединить поля
- Вложенная агрегация
Вариант один и два не доступны для меня, поэтому я собираюсь с 3, но он не отвечает ожидаемым образом. Учитывая следующий запрос (поиск документов, также отмеченных "Печеньем" ):
{
...
"aggs": {
"baked_goods": {
"terms": {
"field": "item.meta.tags.id",
"min_doc_count": 2
},
"aggs": {
"name": {
"terms": {
"field": "item.meta.tags.name"
}
}
}
}
}
}
Я получу этот результат:
{
...
"aggregations": {
"baked_goods": {
"buckets": [
{
"key": "456",
"doc_count": 11,
"name": {
"buckets": [
{
"key": "Biscuits",
"doc_count": 11
},
{
"key": "Cakes",
"doc_count": 11
}
]
}
}
]
}
}
}
Вложенная агрегация включает в себя как поисковый запрос, так и тег, который я получил после (возвращается в алфавитном порядке).
Я попытался смягчить это, добавив exclude
к вложенной агрегации, но это слишком сильно затормозило запрос (около 100 раз для 500 000 документов). До сих пор самым быстрым решением было обнулить результат вручную.
Каков наилучший способ получить агрегирование тегов с идентификатором тега и именем тега в ответе?
Спасибо за то, что сделали это так!