#elasticsearch
#elasticsearch
Вопрос:
У меня есть эластичный индекс (скажем file
), куда я добавляю документ каждый раз, когда файл загружается клиентом. Каждый документ довольно простой, он содержит поле filename
и дату when
для указания времени загрузки.
Чего я хочу добиться, так это получить для каждого файла количество раз, когда он был загружен за последние 3 месяца.
На данный момент, самое близкое, что я получаю с этим запросом:
{
"query": {
"range": {
"when": {
"gte": "now-3M"
}
}
},
"aggs": {
"downloads": {
"terms": {
"field": "filename.keyword"
}
}
}
}
Результат примерно такой:
{
"took": 793,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": 1.0,
"hits": [
{
"_index": "file",
"_type": "_doc",
"_id": "8DkTFHQB3kG435svAA3O",
"_score": 1.0,
"_source": {
"filename": "taz",
"id": 24009,
"when": "2020-08-21T08:11:54.943Z"
}
},
...
]
},
"aggregations": {
"downloads": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 418486,
"buckets": [
{
"key": "file1",
"doc_count": 313873
},
{
"key": "file2",
"doc_count": 281504
},
...,
{
"key": "file10",
"doc_count": 10662
}
]
}
}
}
Поэтому меня очень интересует aggregations.downloads.bucket
, но это ограничено 10 результатами.
Что мне нужно изменить в моем запросе, чтобы иметь весь список (в моем случае у меня будет ~ 15 000 разных файлов)?
Спасибо.
Ответ №1:
По size
terms
умолчанию количество сегментов равно 10. Если вы хотите увеличить его, перейдите к
{
"query": {
"range": {
"when": {
"gte": "now-3M"
}
}
},
"aggs": {
"downloads": {
"terms": {
"field": "filename.keyword",
"size": 15000 <-------
}
}
}
}
Обратите внимание, что существуют стратегии разбиения на страницы этих сегментов с использованием составной агрегации.
Также обратите внимание, что по мере роста вашего индекса вы также можете достичь предела по умолчанию. Это динамический параметр для всего кластера, поэтому его можно изменить.
Комментарии:
1. Спасибо @joe! Я действительно был близок 🙂 Я знал об этом пределе, но я думаю, что мне еще далеко до его достижения. Я также добавлю глобальный,
"size": 0
потому что меня не интересуютhits.hits
результаты.2. Приятно! Эй, поскольку вы обнаружили глобальный поиск
size
, вас также может заинтересовать фильтрация ответов — т. Е. пропуск некоторых потенциально бесполезных оболочек json: elastic.co/guide/en/elasticsearch/reference/current /…