分片请求缓存设置
编辑分片请求缓存设置编辑
当对索引或多个索引运行搜索请求时,每个涉及的分片都会在本地执行搜索并将本地结果返回给协调节点,该节点将这些分片级结果组合成一个“全局”结果集。
分片级请求缓存模块会缓存每个分片上的本地结果。这使得频繁使用(且可能很重)的搜索请求能够几乎立即返回结果。请求缓存非常适合日志记录用例,在该用例中,只有最新的索引正在被积极更新——来自旧索引的结果将直接从缓存中提供。
缓存失效编辑
缓存很智能——它保持与未缓存搜索相同的近实时承诺。
每当分片刷新以获取文档更改或更新映射时,缓存结果会自动失效。换句话说,您始终会从缓存中获得与未缓存搜索请求相同的结果。
刷新间隔越长,即使文档发生更改,缓存条目也会保持有效的时间越长。如果缓存已满,最不常使用的缓存键将被逐出。
可以使用 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
POST /my-index-000001,my-index-000002/_cache/clear?request=true
启用和禁用缓存编辑
缓存默认情况下处于启用状态,但在创建新索引时可以禁用,如下所示
resp = client.indices.create( index="my-index-000001", body={"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
PUT /my-index-000001 { "settings": { "index.requests.cache.enable": false } }
也可以使用 update-settings
API 在现有索引上动态启用或禁用缓存
resp = client.indices.put_settings( index="my-index-000001", body={"index.requests.cache.enable": True}, ) print(resp)
response = client.indices.put_settings( index: 'my-index-000001', body: { 'index.requests.cache.enable' => true } ) puts response
PUT /my-index-000001/_settings { "index.requests.cache.enable": true }
按请求启用和禁用缓存编辑
request_cache
查询字符串参数可用于在每个请求的基础上启用或禁用缓存。如果设置,它将覆盖索引级设置
resp = client.search( index="my-index-000001", request_cache="true", body={ "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
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 按索引查看缓存的大小(以字节为单位)和逐出次数
resp = client.indices.stats( metric="request_cache", human=True, ) print(resp)
response = client.indices.stats( metric: 'request_cache', human: true ) puts 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
GET /_nodes/stats/indices/request_cache?human