Глобальная агрегация не учитывает все документы вasticsearch - PullRequest
0 голосов
/ 05 апреля 2019

Глобальная агрегация не учитывает все документы в моем эластичном поиске.

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

Глобальная агрегация определяет одну группу всех документов в контексте выполнения поиска. Этот контекст определяется индексами и типами документов, которые вы ищете.

Глобальные агрегаторы можно размещать только как агрегаторы верхнего уровня.

{
   "size": 0,
   "aggs":{
      "all_documents":{
         "global":{},
         "aggs":{
            "all_totals":{
               "terms":{
                  "field":"dateReleve"
               },
               "aggs":{
                  "total_clients_cut":{
                     "sum":{
                        "field":"nbClientCoupe"
                     }
                  }
               }
            }
         }
      }
   }
}

значение sum_other_doc_count ожидается равным нулю, но я получаю 299932

{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 302644,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "all_documents": {
            "doc_count": 302644,
            "all_totals": {
                "doc_count_error_upper_bound": 608,
                "sum_other_doc_count": 299932,
                "buckets": [
                    {
                        "key": 1554144600000,
                        "key_as_string": "2019-04-01T18:50:00.000Z",
                        "doc_count": 374,
                        "total_clients_cut": {
                            "value": 178673
                        }
                    },
                    ...

Но когда я увеличиваю размер корзины терминов, выполняя:

{
   "size": 0,
   "aggs":{
      "all_documents":{
         "global":{},
         "aggs":{
            "all_totals":{
               "terms":{
                  "field":"dateReleve",
                  "size": 10000        <----------------------
               },
               "aggs":{
                  "total_clients_cut":{
                     "sum":{
                        "field":"nbClientCoupe"
                     }
                  }
               }
            }
         }
      }
   }
}

Я получаю ожидаемый результат, который равен sum_other_doc_count = 0. Я думаю, что увеличение размера корзины не является хорошей практикой, потому что мы не можем предположить, сколько документов у нас уже есть. Поэтому мой вопрос заключается в том, как получить ожидаемый результат с помощью глобальной агрегации.

1 Ответ

0 голосов
/ 05 апреля 2019

Использование параметра size не обязательно является плохой практикой, но понимание того, что на самом деле происходит, и альтернативы могут быть полезны при определении того, что лучше для вашего варианта использования.

Как указано в документации:

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

Ваш набор результатов должен иметь большую мощность для поля dateReleve; когда поиск выполняется, вы получаете только количество top сегментов, как определено запрашиваемым осколком, которое затем возвращается на узел-координатор, который составляет окончательный список. Вы можете подтвердить это, отметив, что вы получили "doc_count_error_upper_bound": 608

Как указано в документации, вы можете захотеть использовать вместо этого составное агрегирование:

Примечание

Если вы хотите получить все термины или все комбинации терминов в агрегация вложенных терминов, вы должны использовать составное агрегирование что позволяет разбивать на страницы все возможные условия, а не устанавливать Размер больше, чем мощность поля в терминах агрегация. Агрегирование терминов предназначено для возврата верхних терминов. и не допускает нумерацию страниц.

Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...