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

此 API 用于显示集群中每个数据节点的字段数据(fielddata)当前使用的堆内存大小。

API #

GET /_cat/fielddata
GET /_cat/fielddata/{fields}

API 的作用 #

返回集群中每个节点上按字段分组的 fielddata 内存使用情况统计。Fielddata 是 Lucene 在排序和聚合操作时使用的缓存数据,常驻堆内存。

此 API 用于:

  • 内存监控:监控哪些字段占用了大量内存
  • 性能优化:识别高内存消耗的字段
  • 问题排查:诊断内存相关的性能问题
  • 容量规划:评估 JVM 堆内存的使用情况

API 的参数 #

路由参数 #

参数类型是否必需描述
fieldsstring可选要查询的字段列表
可以用逗号分隔多个字段
例如:field1,field2
默认:显示所有字段

查询字符串参数 #

参数类型是否必需默认值描述
bytesstring可选自动字节显示单位
可选值:b, k, kb, m, mb, g, gb, t, tb, p, pb
fieldsstring可选*指定要返回的字段列表(逗号分隔)
formatstring可选text响应格式
可选值:json, yaml, text
hstring可选默认列指定显示的列,逗号分隔
helpboolean可选false显示帮助信息
sstring可选-排序列
支持 :asc:desc
vboolean可选false详细模式,显示列头

返回的字段信息 #

列名别名描述
id-节点 ID
hosth主机名
ip-IP 地址
noden节点名称
fieldf字段名称
sizes字段数据使用量

请求示例 #

# 查询所有字段的 fielddata 使用情况
GET /_cat/fielddata

# 显示列头
GET /_cat/fielddata?v

# 查询特定字段
GET /_cat/fielddata/product_name,category,tags

# 查询特定字段(使用查询字符串参数)
GET /_cat/fielddata?fields=product_name,category

# 使用 JSON 格式
GET /_cat/fielddata?format=json

# 只显示特定列
GET /_cat/fielddata?h=field,size,node

# 按内存使用量降序排列
GET /_cat/fielddata?s=size:desc

# 设置字节单位为 MB
GET /_cat/fielddata?bytes=mb

# 显示帮助信息
GET /_cat/fielddata?help

响应示例 #

文本格式(默认) #

id           host      ip         node         field              size
node-abc123  10.0.1.10 192.168.1.10 data-node-1 product_name      450mb
node-abc123  10.0.1.10 192.168.1.10 data-node-1 category           120mb
node-abc123  10.0.1.10 192.168.1.10 data-node-1 tags               580mb
node-def456  10.0.1.11 192.168.1.11 data-node-2 product_name      420mb
node-def456  10.0.1.11 192.168.1.11 data-node-2 category           115mb
node-def456  10.0.1.11 192.168.1.11 data-node-2 tags               560mb

JSON 格式 #

[
  {
    "id": "node-abc123",
    "host": "10.0.1.10",
    "ip": "192.168.1.10",
    "node": "data-node-1",
    "field": "product_name",
    "size": "450mb"
  },
  {
    "id": "node-abc123",
    "host": "10.0.1.10",
    "ip": "192.168.1.10",
    "node": "data-node-1",
    "field": "tags",
    "size": "580mb"
  }
]

按内存使用量排序 #

GET /_cat/fielddata?s=size:desc&v
id           host      ip         node         field              size
node-abc123  10.0.1.10 192.168.1.10 data-node-1 tags               580mb
node-abc123  10.0.1.10 192.168.1.10 data-node-1 product_name      450mb
node-def456  10.0.1.11 192.168.1.11 data-node-2 tags               560mb
node-def456  10.0.1.11 192.168.1.11 data-node-2 product_name      420mb

使用场景 #

  1. 内存分析:分析哪些字段占用了大量堆内存
  2. 性能优化:优化高内存消耗的字段配置
  3. 问题排查:诊断 OutOfMemoryError 问题
  4. 容量规划:评估 JVM 堆内存需求
  5. 缓存监控:监控 fielddata 缓存的命中率

Fielddata 相关概念 #

Fielddata 是什么? #

Fielddata 是 Lucene 在内存中存储的数据结构,用于:

  • 排序操作
  • 聚合计算
  • 脚本访问字段值

Fielddata 的特点 #

  • 按需加载:字段首次被使用时加载到内存
  • 常驻内存:加载后会一直保留在堆内存中
  • 全局缓存:所有分片共享同一份 fielddata

Fielddata 优化策略 #

1. 使用 doc_values #

对于排序和聚合字段,优先使用 doc_values

{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "keyword",
        "doc_values": true
      }
    }
  }
}

2. 限制 fielddata 大小 #

easysearch.yml 中设置:

indices.breaker.fielddata.limit: 40%
indices.breaker.total.limit: 70%

3. 禁用不需要的字段 #

对于不需要排序/聚合的字段,禁用 fielddata:

{
  "mappings": {
    "properties": {
      "description": {
        "type": "text",
        "fielddata": false
      }
    }
  }
}

Circuit Breaker 设置 #

当 fielddata 达到配置的限制时,Circuit Breaker 会阻止查询以防止内存溢出:

# fielddata 断路器限制
indices.breaker.fielddata.limit: 40%

# 请求断路器限制
indices.breaker.request.limit: 20%

# 总断路器限制
indices.breaker.total.limit: 70%

注意事项 #

  1. 此 API 只支持 GET 方法
  2. 只显示已加载 fielddata 的字段
  3. 未被使用的字段不会出现在结果中
  4. fielddata 会占用大量堆内存,需要合理规划
  5. 高基数字段(如用户 ID)会占用大量内存

最佳实践 #

  1. 使用 doc_values:对于排序和聚合字段,使用 doc_values 替代 fielddata
  2. 限制字段数量:只对必要的字段启用 fielddata
  3. 监控内存使用:定期检查 fielddata 内存占用
  4. 设置断路器:合理配置 Circuit Breaker 限制
  5. 优化数据类型:选择合适的字段类型,如使用 keyword 而非 text

相关文档 #