агрегация терминов elasticsearch с фильтрацией

У меня есть такие объекты в индексе foo:

{ids: ["aa", "bb"]}
{ids: ["aa", "cc"]}
{ids: ["ee"]}
{ids: ["ff" , "cc"]}

В основном я хочу знать, есть ли документы для идентификаторов aa и ee. Я пытался сделать это с помощью агрегации терминов

{
    "size": 0,
   "query": {
      "bool": {
        "should": [
             {
                  "terms": {
                    "ids": [
                      "aa", "ee"
                    ],
                    "boost": 1
                 }
              }
           ],
           "adjust_pure_negative": true,
           "boost": 1
         }
      },
  "aggregations": {
    "byid": {
      "terms": {
        "field": "ids",
        "min_doc_count": 1
      }
    }
  }
}

но проблема тут в том, что в ответ я получил агрегацию еще и с другими ids, которые есть у выбранных сущностей, а их в реальном случае очень много, поэтому интересующая меня агрегация по ids не могла прийти в ответ и я буду думать, что там для них нет пунктов (но на самом деле они есть, но не в ответе из-за ограничения размера срока)

Я мог бы сделать это для каждого id отдельно без аггсов просто получить count, но их очень много и это будет очень дорого.


person Егор Лебедев    schedule 07.11.2020    source источник


Ответы (1)


На основе чата выяснилось, что ни один из документов, содержащих идентификаторы, не требуется, следовательно, агрегация не требуется, теперь основной вопрос, присутствует ли конкретный идентификатор в результатах поиска или нет.

есть пара подходов:

  1. Используйте multi_search с одним идентификатором в каждом подразделе. запрос
  2. Используйте один поисковый запрос со всеми идентификаторами, но выполняйте постобработку с помощью скрипта или source_filtering и идентификатор поиска в ответе.
person user156327    schedule 07.11.2020
comment
Мне нужно знать существование для каждого идентификатора отдельно. - person Егор Лебедев; 07.11.2020
comment
@ЕгорЛебедев, пожалуйста, посмотрите мой обновленный ответ, я не понял, что вы подразумеваете под существованием каждого идентификатора ?? было бы здорово, если бы вы могли предоставить ожидаемый результат - person user156327; 07.11.2020
comment
Пожалуйста, дочитайте до конца, в реальном случае много идентификаторов, и ограничение размера агрегации терминов может отбросить интересующие меня идентификаторы. Например, если меня интересуют идентификаторы aa и zz. из ответа на запрос я должен понять, что есть некоторые документы для aa, но нет документов для zz, и из простого поиска я не мог понять, что - person Егор Лебедев; 07.11.2020
comment
@ЕгорЛебедев, вы можете указать атрибут размера в агрегации, чтобы он возвращал вам все результаты, но да, есть штраф за производительность - person user156327; 07.11.2020
comment
@ЕгорЛебедев Также с помощью elastic.co /guide/en/elasticsearch/reference/6.8/ фильтрация источников, вы можете узнать, какой идентификатор содержит ваши результаты поиска - person user156327; 07.11.2020
comment
Я не могу указать размер атрибута, потому что сначала мне нужно знать, сколько там уникальных идентификаторов, но что более важно, их около 23 миллионов, так что да, есть снижение производительности. - person Егор Лебедев; 07.11.2020
comment
Давайте продолжим это обсуждение в чате. - person user156327; 07.11.2020