Ограничение и смещение в агрегации терминов ElasticSearch

Есть способ получить лучший результат из n терминов. Например:

{
  "aggs": {
    "apiSalesRepUser": {
      "terms": {
        "field": "userName",
        "size": 5
      }
    }
  }
}

Есть ли способ установить смещение для результата условий?


person Mukesh Kumar    schedule 02.04.2015    source источник
comment
elastic.co/guide/en/ elasticsearch/reference/1.4/ возможно, используя from ? ( эластичный .co/guide/en/elasticsearch/reference/current/ внутри агрегации)   -  person Utopik    schedule 02.04.2015
comment
@Utopik Это не относится к агрегациям. Это относится только к возвращенным хитам.   -  person bittusarkar    schedule 03.04.2015


Ответы (3)


Если вы имеете в виду что-то вроде игнорирования первых m результатов и возврата следующих n результатов, то нет; это невозможно. В качестве обходного пути можно установить size на m + n и выполнить обработку на стороне клиента, чтобы игнорировать первые m результаты.

person bittusarkar    schedule 02.04.2015

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

https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_partitions

person c_froehlich    schedule 16.01.2020

Возможно, это немного поможет:

"aggregations": {
    "apiSalesRepUser": {
      "terms": {
        "field": "userName",
        "size": 9999 ---> add here a bigger size 
      }
    },
  "aggregations": {
    "limitBucket": {
      "bucket_sort": {
        "sort": [],
        "from": 10,
        "size": 20,
        "gap_policy": "SKIP"
      }
    }
  }
}

Я не уверен, какое значение вкладывать в термин размер. Я бы предложил поставить разумное значение. Это ограничивает первоначальную агрегацию, затем второй gg limitBucket снова ограничит термин gg. Это, вероятно, все равно загрузит в память все документы, которые вы ограничили в терминах агг. Вот почему это зависит от вашего сценария, если разумно не получить все результаты (т.е. если у вас есть десятки тысяч). То есть вы выполняете поиск в Google, где вам не нужно переходить на страницу 1000.

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

person andreyro    schedule 02.04.2020