Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Архитектура хранилища данных

Кэш запросов фрагментов

Когда запрос поиска выполняется на индексе или на нескольких индексах, каждый вовлеченный фрагмент выполняет поиск локально и возвращает свои локальные результаты в координирующий узел, который объединяет эти результаты уровня фрагмента в «глобальный» набор результатов.

Модуль кэша запросов фрагментов кэширует локальные результаты на каждом фрагменте. Это позволяет часто используемым (и потенциально ресурсоёмким) запросам поиска возвращать результаты практически мгновенно. Кэш запросов очень подходит для случая ведения журналов, когда активно обновляется только самый последний индекс — результаты из более старых индексов будут обслуживаться непосредственно из кэша.

Вы можете управлять размером и временем жизни кэша на уровне узла с помощью настроек кэша запросов фрагментов.

По умолчанию кэш запросов будет кэшировать только результаты запросов поиска, где size=0, поэтому он не будет кэшировать hits, но будет кэшировать hits.total, агрегации и предложения.

Большинство запросов, использующих now (см. Математику дат), не могут быть кэшированы.

Скриптовые запросы, использующие API-вызовы, которые не являются детерминированными, такие как Math.random() или new Date(), не кэшируются.

Очистка кэша

Кэш умный — он сохраняет то же обещание почти реального времени, что и поиск без кэширования.

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

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

Кэш можно вручную аннулировать с помощью clear-cache API:

resp = client.indices.clear_cache(
    index="my-index-000001,my-index-000002",
    request=True,
)
print(resp)
response = client.indices.clear_cache(
  index: 'my-index-000001,my-index-000002',
  request: true
)
puts response
const response = await client.indices.clearCache({
  index: "my-index-000001,my-index-000002",
  request: "true",
});
console.log(response);
POST /my-index-000001,my-index-000002/_cache/clear?request=true

Включение и отключение кэширования

Кэш включён по умолчанию, но может быть отключён при создании нового индекса следующим образом:

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "index.requests.cache.enable": False
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      'index.requests.cache.enable' => false
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    "index.requests.cache.enable": false,
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "index.requests.cache.enable": false
  }
}

Также его можно включить или отключить динамически на существующем индексе с помощью update-settings API:

resp = client.indices.put_settings(
    index="my-index-000001",
    settings={
        "index.requests.cache.enable": True
    },
)
print(resp)
response = client.indices.put_settings(
  index: 'my-index-000001',
  body: {
    'index.requests.cache.enable' => true
  }
)
puts response
const response = await client.indices.putSettings({
  index: "my-index-000001",
  settings: {
    "index.requests.cache.enable": true,
  },
});
console.log(response);
PUT /my-index-000001/_settings
{ "index.requests.cache.enable": true }

Включение и отключение кэширования для каждого запроса

Параметр запроса request_cache может использоваться для включения или отключения кэширования на основе конкретного запроса. Если установлен, он переопределяет настройку на уровне индекса:

resp = client.search(
    index="my-index-000001",
    request_cache=True,
    size=0,
    aggs={
        "popular_colors": {
            "terms": {
                "field": "colors"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  request_cache: true,
  body: {
    size: 0,
    aggregations: {
      popular_colors: {
        terms: {
          field: 'colors'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  request_cache: "true",
  size: 0,
  aggs: {
    popular_colors: {
      terms: {
        field: "colors",
      },
    },
  },
});
console.log(response);
GET /my-index-000001/_search?request_cache=true
{
  "size": 0,
  "aggs": {
    "popular_colors": {
      "terms": {
        "field": "colors"
      }
    }
  }
}

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

Ключ кэша

В качестве ключа кэша используется хэш всего тела JSON. Это означает, что если JSON изменится — например, если ключи будут выведены в другом порядке — то ключ кэша не будет распознан.

Большинство библиотек JSON поддерживают канонический режим, который гарантирует, что ключи JSON всегда выводятся в одном и том же порядке. Этот канонический режим может использоваться в приложении для обеспечения того, что запрос всегда сериализуется одинаково.

Мониторинг использования кэша

Размер кэша (в байтах) и количество удалений могут быть просмотрены по индексу с помощью indices-stats API:

resp = client.indices.stats(
    metric="request_cache",
    human=True,
)
print(resp)
response = client.indices.stats(
  metric: 'request_cache',
  human: true
)
puts response
const response = await client.indices.stats({
  metric: "request_cache",
  human: "true",
});
console.log(response);
GET /_stats/request_cache?human

или по узлу с помощью nodes-stats API:

resp = client.nodes.stats(
    metric="indices",
    index_metric="request_cache",
    human=True,
)
print(resp)
response = client.nodes.stats(
  metric: 'indices',
  index_metric: 'request_cache',
  human: true
)
puts response
const response = await client.nodes.stats({
  metric: "indices",
  index_metric: "request_cache",
  human: "true",
});
console.log(response);
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/8.17/shard-request-cache.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API