Настройка кэша запросов фрагментов
При выполнении запроса поиска к индексу или к нескольким индексам каждый вовлеченный фрагмент выполняет поиск локально и возвращает свои локальные результаты координирующему узлу, который объединяет эти результаты уровня фрагмента в «глобальный» набор результатов.
Модуль кэша запросов фрагментов кэширует локальные результаты на каждом фрагменте. Это позволяет часто используемым (и потенциально ресурсоемким) запросам поиска возвращать результаты практически мгновенно. Кэш запросов отлично подходит для сценариев логирования, где активно обновляется только последний индекс — результаты из более старых индексов будут предоставляться непосредственно из кэша.
По умолчанию кэш запросов будет кэшировать результаты запросов поиска только в том случае, если size=0, поэтому он не будет кэшировать hits, но будет кэшировать hits.total, агрегации и подсказки.
Большинство запросов, использующих now (см. Математика дат), не могут быть кэшированы.
Скриптовые запросы, использующие API-вызовы, которые не являются детерминированными, такие как Math.random() или new Date(), не кэшируются.
Искажение кэша
Кэш интеллектуальный — он сохраняет ту же обещание «почти реального времени», что и поиск без кэша.
Кэшированные результаты автоматически аннулируются всякий раз, когда фрагмент обновляется для получения изменений в документах или при обновлении отображения. Другими словами, вы всегда получите те же результаты из кэша, что и для запроса поиска без кэша.
Чем длиннее интервал обновления, тем дольше кэшированные записи останутся действительными, даже если есть изменения в документах. Если кэш заполнен, ключи кэша, которые использовались меньше всего, будут удалены.
Кэш можно вручную аннулировать с помощью clear-cache API:
POST /my-index-000001,my-index-000002/_cache/clear?request=true
Включение и выключение кэширования
Кэш включен по умолчанию, но его можно отключить при создании нового индекса следующим образом:
PUT /my-index-000001
{
"settings": {
"index.requests.cache.enable": false
}
} Его также можно включить или отключить динамически в существующем индексе с помощью update-settings API:
PUT /my-index-000001/_settings
{ "index.requests.cache.enable": true } Включение и выключение кэширования по запросу
Параметр запроса request_cache можно использовать для включения или отключения кэширования на уровне каждого запроса. Если он установлен, он переопределяет настройку уровня индекса:
GET /my-index-000001/_search?request_cache=true
{
"size": 0,
"aggs": {
"popular_colors": {
"terms": {
"field": "colors"
}
}
}
} Запросы, где size больше 0, не будут кэшированы, даже если кэш запросов включен в настройках индекса. Для кэширования этих запросов необходимо использовать параметр строки запроса, описанный здесь.
Ключ кэша
В качестве ключа кэша используется хеш всего тела JSON. Это означает, что если JSON изменится — например, если ключи выводятся в другом порядке — то ключ кэша не будет распознан.
Большинство библиотек JSON поддерживают режим канонической записи, который гарантирует, что ключи JSON всегда вычисляются в одном и том же порядке. Этот канонический режим можно использовать в приложении для обеспечения того, что запрос всегда сериализуется одинаково.
Настройки кэша
Кэш управляется на уровне узла и имеет максимальный размер по умолчанию 1% кучи. Это можно изменить в файле config/elasticsearch.yml следующим образом:
indices.requests.cache.size: 2%
Также можно использовать настройку indices.requests.cache.expire для задания TTL для кэшированных результатов, но нет необходимости это делать. Помните, что устаревшие результаты автоматически аннулируются при обновлении индекса. Эта настройка предоставлена только для полноты.
Мониторинг использования кэша
Размер кэша (в байтах) и количество удалений можно просмотреть по индексу с помощью indices-stats API:
GET /_stats/request_cache?human
или по узлу с помощью nodes-stats API:
GET /_nodes/stats/indices/request_cache?human
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/shard-request-cache.html