シャードリクエストキャッシュ設定

インデックスまたは複数のインデックスに対して検索リクエストが実行されると、各シャードがローカルで検索を実行し、そのローカル結果をコーディネーティングノードに返します。このノードは、これらのシャードレベルの結果を「グローバル」な結果セットに統合します。

シャードレベルのリクエストキャッシュモジュールは、各シャードのローカル結果をキャッシュします。これにより、頻繁に使用される(おそらく重い)検索リクエストがほぼ瞬時に結果を返すことができます。リクエストキャッシュは、最新のインデックスのみが積極的に更新されているログ記録のユースケースに非常に適しています—古いインデックスからの結果はキャッシュから直接提供されます。

デフォルトでは、リクエストキャッシュはsize=0の検索リクエストの結果のみをキャッシュしますので、hitsはキャッシュされませんが、hits.total集約、および提案はキャッシュされます。

  1. `````Math.random()``````````new Date()`````のような非決定的なAPI呼び出しを使用するスクリプト化されたクエリはキャッシュされません。
  2. ## キャッシュの無効化
  3. キャッシュは賢いです—それはキャッシュされていない検索と同じ*ほぼリアルタイム*の約束を保持します。
  4. キャッシュされた結果は、シャードがドキュメントの変更を取得するためにリフレッシュされるたび、またはマッピングを更新すると自動的に無効化されます。言い換えれば、キャッシュから得られる結果は、キャッシュされていない検索リクエストから得られる結果と常に同じです。
  5. リフレッシュ間隔が長いほど、ドキュメントに変更があってもキャッシュエントリが有効である期間が長くなります。キャッシュが満杯の場合、最も最近使用されていないキャッシュキーが追い出されます。
  6. キャッシュは、[`````clear-cache````` API](/read/elasticsearch-8-15/fdf55dbbd8c9aa53.md)を使用して手動で期限切れにすることができます:
  7. #### Python
  8. ``````python
  9. resp = client.indices.clear_cache(
  10. index="my-index-000001,my-index-000002",
  11. request=True,
  12. )
  13. print(resp)
  14. `

Ruby

  1. response = client.indices.clear_cache(
  2. index: 'my-index-000001,my-index-000002',
  3. request: true
  4. )
  5. puts response

Js

  1. const response = await client.indices.clearCache({
  2. index: "my-index-000001,my-index-000002",
  3. request: "true",
  4. });
  5. console.log(response);

コンソール

  1. POST /my-index-000001,my-index-000002/_cache/clear?request=true

キャッシュの有効化と無効化

キャッシュはデフォルトで有効ですが、新しいインデックスを作成する際に次のように無効にすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "index.requests.cache.enable": False
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. 'index.requests.cache.enable' => false
  6. }
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. "index.requests.cache.enable": false,
  5. },
  6. });
  7. console.log(response);

コンソール

  1. PUT /my-index-000001
  2. {
  3. "settings": {
  4. "index.requests.cache.enable": false
  5. }
  6. }

既存のインデックスでupdate-settings APIを使用して動的に有効化または無効化することもできます:

Python

  1. resp = client.indices.put_settings(
  2. index="my-index-000001",
  3. settings={
  4. "index.requests.cache.enable": True
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'my-index-000001',
  3. body: {
  4. 'index.requests.cache.enable' => true
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "my-index-000001",
  3. settings: {
  4. "index.requests.cache.enable": true,
  5. },
  6. });
  7. console.log(response);

コンソール

  1. PUT /my-index-000001/_settings
  2. { "index.requests.cache.enable": true }

リクエストごとのキャッシュの有効化と無効化

  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="my-index-000001",
  5. request_cache=True,
  6. size=0,
  7. aggs={
  8. "popular_colors": {
  9. "terms": {
  10. "field": "colors"
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. `

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. request_cache: true,
  4. body: {
  5. size: 0,
  6. aggregations: {
  7. popular_colors: {
  8. terms: {
  9. field: 'colors'
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. request_cache: "true",
  4. size: 0,
  5. aggs: {
  6. popular_colors: {
  7. terms: {
  8. field: "colors",
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. GET /my-index-000001/_search?request_cache=true
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "popular_colors": {
  6. "terms": {
  7. "field": "colors"
  8. }
  9. }
  10. }
  11. }
  1. ## キャッシュキー
  2. 全体のJSONボディのハッシュがキャッシュキーとして使用されます。これは、JSONが変更された場合—たとえば、キーが異なる順序で出力される場合—キャッシュキーが認識されなくなることを意味します。
  3. ほとんどのJSONライブラリは、JSONキーが常に同じ順序で出力されることを保証する*標準*モードをサポートしています。この標準モードは、リクエストが常に同じ方法でシリアライズされることを保証するためにアプリケーションで使用できます。
  4. ## キャッシュ設定
  5. キャッシュはノードレベルで管理され、デフォルトの最大サイズはヒープの`````1%`````です。これは、`````config/elasticsearch.yml`````ファイルで変更できます:
  6. #### Yaml
  7. ``````yaml
  8. indices.requests.cache.size: 2%
  9. `

また、indices.requests.cache.expire設定を使用してキャッシュされた結果のTTLを指定できますが、その必要はありません。インデックスがリフレッシュされると、古い結果は自動的に無効化されることを忘れないでください。この設定は完全性のためだけに提供されています。

キャッシュ使用状況の監視

キャッシュのサイズ(バイト単位)と追い出された数は、indices-stats APIを使用してインデックスごとに表示できます:

Python

  1. resp = client.indices.stats(
  2. metric="request_cache",
  3. human=True,
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.stats(
  2. metric: 'request_cache',
  3. human: true
  4. )
  5. puts response

Js

  1. const response = await client.indices.stats({
  2. metric: "request_cache",
  3. human: "true",
  4. });
  5. console.log(response);

コンソール

  1. GET /_stats/request_cache?human

または、nodes-stats APIを使用してノードごとに表示できます:

Python

  1. resp = client.nodes.stats(
  2. metric="indices",
  3. index_metric="request_cache",
  4. human=True,
  5. )
  6. print(resp)

Ruby

  1. response = client.nodes.stats(
  2. metric: 'indices',
  3. index_metric: 'request_cache',
  4. human: true
  5. )
  6. puts response

Js

  1. const response = await client.nodes.stats({
  2. metric: "indices",
  3. index_metric: "request_cache",
  4. human: "true",
  5. });
  6. console.log(response);

コンソール

  1. GET /_nodes/stats/indices/request_cache?human