Агрегация терминов Elasticsearch по массиву-фильтр для сегментов, соответствующих вашему запросу?

#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 время запроса.

Как я могу ограничить свои корзины только теми, которые соответствуют фильтрам в моем запросе?

Спасибо вам за вашу помощь!