Почему ключевое слово "from" становится неузнаваемым при достижении нумерации страниц в агрегировании в Elasti c Поиск - PullRequest
0 голосов
/ 23 апреля 2020

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

 "aggs": {
            "source_list": {
                "terms": {
                    "field": "source.keyword",
                    "from": 0,
                    "size": 50,
                },
            },
        },

Это звучит довольно прямо, но вместо этого я достиг предела этого, следующая ошибка.

{"detail":"RequestError(400, 'x_content_parse_exception', '[1:59] [terms] unknown field [from]')"}

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Разбиение на страницы в агрегации не поддерживается в Elasticsearch

Поскольку поддерживается только size, необходимо удалить параметр from из запроса aggs. Если общий размер контейнеров является разумным, просто увеличьте значение размера до макс. В противном случае вы можете попробовать разбиение агрегацию.

Например:

"aggs": {
    "source_list": {
        "terms": {
            "field": "source.keyword",
            "size": 50,
            "include": {
                "partition": 0,
                "num_partitions": 10
            }
        },
    },
}
  • Выберите значение для num_partitions, чтобы разбить число на более управляемые куски
  • Выберите значение размера для количества ответов мы хотим от каждого раздела

Источник: Elasticsearch фильтрация значений с разделами

0 голосов
/ 23 апреля 2020

От и размер, как в запросе, не доступны в агрегациях

Вы можете использовать следующие параметры для разбивки на страницы при аггегации: -

  1. Составное агрегирование : можно объединить несколько источников данных в одно ведро и разрешить разбивку на страницы и сортировку по ним. Он может выполнять линейное разбиение на страницы только с помощью after_key, т.е. вы не можете переходить со страницы 1 на страницу 3. Вы можете получить «n» записей, затем передать возвращенные после ключа и получить следующие «n» записи.
GET index22/_search
{
 "size": 0,
 "aggs": {
   "pagination": {
     "composite": {
       "size": 1,
       "sources": [
         {
           "source_list": {
             "terms": {
               "field": "sources.keyword"
             }
           }
         }
       ]
     }
   }
 }
}

Результат:

"aggregations" : {
    "pagination" : {
      "after_key" : {
        "source_list" : "a" --> used to fetch next records linearly
      },
      "buckets" : [
        {
          "key" : {
            "source_list" : "a"
          },
          "doc_count" : 1
        }
      ]
    }
  }

Для получения следующей записи

{
  "size": 0,
  "aggs": {
    "pagination": {
      "composite": {
        "size": 1,
        "after": {"source_list" : "a"}, 
        "sources": [
          {
            "source_list": {
              "terms": {
                "field": "sources.keyword"
              }
            }
          }
        ]
      }
    }
  }
}
Включить раздел : группирует значения поля в число разделов во время запроса и обрабатывает только один раздел в каждом запросе. Термины поля равномерно распределены по разным разделам. Таким образом, вы должны знать количество терминов заранее. Вы можете использовать кардинальное агрегирование , чтобы получить счет
GET index/_search
{
  "size": 0,
  "aggs": {
    "source_list": {
      "terms": {
        "field": "sources.keyword",
        "include": {
          "partition": 1,
          "num_partitions": 3
        }
      }
    }
  }
}

Агрегация сортировки по группам : сортирует группы по родительским группам. Каждый сегмент может быть отсортирован по его _key, _count или его подгруппам. Это относится только к сегментам, возвращенным из родительской агрегации. Вам нужно будет установить размер термина на 10 000 (максимальное значение) и усечь сегменты в bucket_sort. Вы можете разбивать на страницы, используя from и size, как в запросе. Если у вас есть термины, превышающие 10000, вы не сможете использовать его, поскольку он выбирает только те сегменты, которые возвращены термином.
GET index/_search
{
  "size": 0,
  "aggs": {
    "source_list": {
      "terms": {
        "field": "sources.keyword",
        "size": 10000 --> use large value to get all terms
      },
      "aggs": {
        "my_bucket": {
          "bucket_sort": {
            "sort": [
              {
                "_key": {
                  "order": "asc"
                }
              }
            ],
            "from": 1, 
            "size": 1
          }
        }
      }
    }
  }
}

С точки зрения производительности составное агрегирование - лучший выбор

0 голосов
/ 23 апреля 2020

Вы можете выполнять разбиение на страницы только для результатов возврата, а не для агрегирования:

{
      "query": {
          ....
      },
      "from":0
      "size":50,
      "aggs":{
          ....
      }
}
...