📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

indices.queries.cache.size 配置项控制查询缓存(Query Cache)的 JVM 堆内存大小。查询缓存用于缓存查询结果,提高重复查询的性能。

配置项类型 #

该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。

默认值 #

10%(JVM 堆内存的 10%)

是否必需 #

可选配置项(有默认值)

配置格式 #

# 百分比格式(默认)
indices.queries.cache.size: 10%

# 字节格式
indices.queries.cache.size: 2gb

# 混合格式
indices.queries.cache.size: 20%

配置项列表 #

配置项默认值说明
indices.queries.cache.size10%缓存大小
indices.queries.cache.count10000缓存条目数量
indices.queries.cache.all_segmentsfalse是否缓存所有段

工作原理 #

查询缓存缓存查询结果,当相同的查询再次执行时直接返回缓存结果:

┌─────────────────────────────────────────────────────────┐
│                   查询请求                                │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
            ┌───────────┴───────────┐
            │                       │
        缓存命中              缓存未命中
            │                       │
            ▼                       ▼
    直接返回缓存          执行查询并缓存结果

使用示例 #

# 默认配置
indices.queries.cache.size: 10%

# 自定义大小
indices.queries.cache.size: 4gb

# 使用百分比
indices.queries.cache.size: 15%

# 禁用缓存
indices.queries.cache.size: 0b

动态修改 #

# 通过 API 动态修改
PUT /_cluster/settings
{
  "transient": {
    "indices.queries.cache.size": "4gb"
  }
}

推荐设置建议 #

生产环境建议:根据查询模式和数据量设置

场景推荐配置说明
大量重复查询15-20%提高缓存命中率
查询多样化5-10%减少内存占用
大数据集10-15%默认配置
小内存节点5% 或更小避免内存压力

缓存效果 #

缓存命中率影响:

命中率性能提升内存使用
> 80%显著提升较高
50-80%明显提升适中
< 50%轻微提升较低
< 20%几乎无效浪费内存

相关配置项 #

配置项默认值说明
indices.queries.cache.count10000缓存条目数量
indices.requests.cache.size1%请求缓存大小
indices.queries.cache.all_segmentsfalse缓存所有段

缓存策略 #

查询缓存使用 LRU(最近最少使用)淘汰策略:

┌─────────────────────────────────────────────────────────┐
│                  LRU 淘汰策略                              │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
┌───────────────┴───────────────┐
│                               │
    新查询进入                     最少使用的查询被淘汰
    │                               │
    ▼                               ▼
[查询1] [查询2] ... [查询10000]
   ↑                           ↓
 最常用                     最少用
   ↑                           ↓
保留                          淘汰

查看缓存状态 #

# 查看查询缓存统计
GET /_nodes/stats/indices/query_cache?pretty

# 查看特定索引的缓存
GET /my_index/_cache/stats

常见问题 #

问题 1:缓存未生效

可能原因:

  1. 查询使用了 now() 等随机函数
  2. 查询条件包含随机数
  3. 查询每次都不同

解决方案:

// 避免使用随机查询
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "2024-01-01",
        "lte": "2024-01-31"
      }
    }
  }
}

问题 2:缓存占用内存过多

解决方案:

# 减小缓存大小
PUT /_cluster/settings
{
  "transient": {
    "indices.queries.cache.size": "5%"
  }
}

问题 3:缓存命中率低

解决方案:

  1. 优化查询使其可缓存
  2. 增加缓存大小
  3. 分析查询模式

查询缓存条件 #

查询结果可以被缓存的必要条件:

  1. 查询完全相同:包括查询条件、排序、聚合等
  2. 索引未修改:缓存期间索引没有数据变更
  3. 使用缓存上下文:查询使用 request_cache=true
  4. 确定性查询:不包含随机函数

示例:

// 可缓存的查询
GET /my_index/_search?request_cache=true
{
  "query": {
    "term": { "status": "active" }
  }
}

// 不可缓存的查询(使用 now())
GET /my_index/_search?request_cache=true
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-1d"
      }
    }
  }
}

性能优化建议 #

1. 启用请求缓存

对于重复查询,启用请求缓存:

GET /my_index/_search?request_cache=true

2. 优化查询模式

// 优化前:每次查询不同
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-1h"
      }
    }
  }
}

// 优化后:使用固定时间范围
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "2024-01-01T00:00:00",
              "lte": "2024-01-01T01:00:00"
            }
          }
        },
        {
          "term": { "user": "user1" }
        }
      ]
    }
  }
}

缓存清理 #

缓存会在以下情况被清理:

  1. 段合并:段合并时缓存失效
  2. 索引更新:文档被修改后相关缓存失效
  3. 手动清理:通过 API 清理
# 清理特定索引的缓存
POST /my_index/_cache/clear

# 清理所有索引的缓存
POST /_cache/clear

监控建议 #

# 监控缓存统计
GET /_nodes/stats/indices/query_cache?pretty

# 查看 hit/miss 比率
GET /_cat/nodeattrs?v&h=name,*.query_cache*

注意事项 #

  1. 动态更新:此配置为动态配置,可在线修改
  2. 内存占用:缓存占用 JVM 堆内存
  3. 命中率监控:建议监控缓存命中率以评估效果
  4. 段合并:段合并会导致缓存失效
  5. 合理设置:根据查询模式和数据特点调整