Как получить количество документов для каждого события в Elastic?

#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 /…