#elasticsearch
Вопрос:
Я использую terms
агрегацию elasticsearch для сортировки на основе свойства массива в каждом документе. Я сталкиваюсь с проблемой, когда я возвращаю ведра, которых нет в моем запросе, и я хотел бы их отфильтровать.
Допустим , каждый документ является a Post
и имеет свойство массива media, которое указывает, на каком веб-сайте в социальных сетях находится сообщение (и может быть пустым).:
{
id: 1
media: ["facebook", "twitter", "instagram"]
}
{
id: 2
media: ["twitter", "instagram", "tiktok"]
}
{
id: 3
media: ["instagram"]
}
{
id: 4
media: []
}
И, допустим, есть еще один индекс Users
, в котором хранится favorite_media
свойство того же типа.
{
id: 42
favorite_media: ["twitter", "instagram"]
}
У меня есть запрос, который использует a terms lookup
для фильтрации, а затем выполняет terms
агрегацию.
{
"query": {
"filter": {
"terms": {
"index": "user_index",
"id": 42,
"path": "favorite_media"
}
}
},
"aggs": {
"Posts_by_media": {
"terms": {
"field": "media",
"size": 1000
}
}
}
}
Это приведет к:
{
...
"aggregations": {
"Posts_by_media": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "instagram",
"doc_count": 3
},
{
"key": "twitter",
"doc_count": 2
},
{
"key": "facebook",
"doc_count": 1
},
{
"key": "tiktok",
"doc_count": 1
}
]
}
}
}
Поскольку media
это свойство массива, любой документ, соответствующий фильтру, будет использоваться для создания сегментов, и у меня будут сегменты, которые не соответствуют моему фильтру. Здесь я хочу вернуть только ведра facebook
и instagram
, поскольку это те два, на которые я фильтрую (с помощью поиска терминов).
Я знаю, что агрегирование терминов предлагает возможность включения, но это не работает для меня здесь, так как я использую поиск терминов и не знаю данных во favorite_media
время запроса.
Как я могу ограничить свои корзины только теми, которые соответствуют фильтрам в моем запросе?
Спасибо вам за вашу помощь!