Ответ
Для профилирования запросов в Elasticsearch используется Profile API, который включается добавлением параметра "profile": true
в тело запроса. Это позволяет получить детальную разбивку по времени выполнения для каждой компоненты запроса на каждой шарде.
1. Как включить профилирование
Просто добавьте флаг profile
в ваш поисковый запрос:
GET /my-index/_search
{
"query": {
"match": {
"message": "test"
}
},
"profile": true
}
2. Что анализировать в ответе
Ответ будет содержать секцию profile
, в которой для каждой шарды (shards
) будет детальная информация о времени, затраченном на разные фазы.
Ключевые секции для анализа:
query
: Дерево компонентов вашего запроса. Ищите узлы с большим значениемtime_in_nanos
.breakdown
: Детальная статистика по времени, потраченному на создание весов, скоринг, сбор документов и т.д.collector
: Информация о том, как собирались результаты.
Пример фрагмента ответа:
"profile": {
"shards": [
{
"searches": [
{
"query": [
{
"type": "BooleanQuery",
"description": "...",
"time_in_nanos": 123456,
"breakdown": { ... },
"children": [ ... ]
}
]
}
]
}
]
}
3. Визуальный анализ в Kibana
Самый удобный способ анализировать результаты — использовать Dev Tools в Kibana.
- Перейдите в
Dev Tools
. - Выполните ваш запрос с
"profile": true
. - Переключитесь на вкладку "Search Profiler" в панели результатов.
Kibana предоставит интерактивный визуальный интерфейс для анализа узких мест в вашем запросе, что гораздо удобнее, чем читать сырой JSON.
Важно:
- Профилирование добавляет существенную нагрузку (
overhead
) на выполнение запроса. - Используйте его только для отладки и оптимизации, а не в обычном режиме работы приложения.