--- title: "查询字段数据缓存" date: 2026-02-09 lastmod: 2026-02-09 description: "介绍如何使用 Cat API 查询 Easysearch 集群中字段数据(fielddata)的内存使用情况。" tags: ["Cat API", "字段数据", "内存", "监控"] summary: "此 API 用于显示集群中每个数据节点的字段数据(fielddata)当前使用的堆内存大小。 API # GET /_cat/fielddata GET /_cat/fielddata/{fields} API 的作用 # 返回集群中每个节点上按字段分组的 fielddata 内存使用情况统计。Fielddata 是 Lucene 在排序和聚合操作时使用的缓存数据,常驻堆内存。 此 API 用于: 内存监控:监控哪些字段占用了大量内存 性能优化:识别高内存消耗的字段 问题排查:诊断内存相关的性能问题 容量规划:评估 JVM 堆内存的使用情况 API 的参数 # 路由参数 # 参数 类型 是否必需 描述 fields string 可选 要查询的字段列表 可以用逗号分隔多个字段 例如:field1,field2 默认:显示所有字段 查询字符串参数 # 参数 类型 是否必需 默认值 描述 bytes string 可选 自动 字节显示单位" --- 此 API 用于显示集群中每个数据节点的字段数据(fielddata)当前使用的堆内存大小。 ## API ``` GET /_cat/fielddata GET /_cat/fielddata/{fields} ``` ## API 的作用 返回集群中每个节点上按字段分组的 fielddata 内存使用情况统计。Fielddata 是 Lucene 在排序和聚合操作时使用的缓存数据,常驻堆内存。 此 API 用于: - **内存监控**:监控哪些字段占用了大量内存 - **性能优化**:识别高内存消耗的字段 - **问题排查**:诊断内存相关的性能问题 - **容量规划**:评估 JVM 堆内存的使用情况 ## API 的参数 ### 路由参数 | 参数 | 类型 | 是否必需 | 描述 | |------|------|----------|------| | `fields` | string | 可选 | 要查询的字段列表
可以用逗号分隔多个字段
例如:`field1,field2`
默认:显示所有字段 | ### 查询字符串参数 | 参数 | 类型 | 是否必需 | 默认值 | 描述 | |------|------|----------|--------|------| | `bytes` | string | 可选 | 自动 | 字节显示单位
可选值:`b`, `k`, `kb`, `m`, `mb`, `g`, `gb`, `t`, `tb`, `p`, `pb` | | `fields` | string | 可选 | * | 指定要返回的字段列表(逗号分隔) | | `format` | string | 可选 | text | 响应格式
可选值:`json`, `yaml`, `text` | | `h` | string | 可选 | 默认列 | 指定显示的列,逗号分隔 | | `help` | boolean | 可选 | false | 显示帮助信息 | | `s` | string | 可选 | - | 排序列
支持 `:asc` 和 `:desc` | | `v` | boolean | 可选 | false | 详细模式,显示列头 | ## 返回的字段信息 | 列名 | 别名 | 描述 | |------|------|------| | `id` | - | 节点 ID | | `host` | `h` | 主机名 | | `ip` | - | IP 地址 | | `node` | `n` | 节点名称 | | `field` | `f` | 字段名称 | | `size` | `s` | 字段数据使用量 | ## 请求示例 ```bash # 查询所有字段的 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 格式 ```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" } ] ``` ### 按内存使用量排序 ```bash 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`: ```json { "mappings": { "properties": { "product_name": { "type": "keyword", "doc_values": true } } } } ``` #### 2. 限制 fielddata 大小 在 `easysearch.yml` 中设置: ```yaml indices.breaker.fielddata.limit: 40% indices.breaker.total.limit: 70% ``` #### 3. 禁用不需要的字段 对于不需要排序/聚合的字段,禁用 fielddata: ```json { "mappings": { "properties": { "description": { "type": "text", "fielddata": false } } } } ``` ## Circuit Breaker 设置 当 fielddata 达到配置的限制时,Circuit Breaker 会阻止查询以防止内存溢出: ```yaml # 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 ## 相关文档 - [查询节点](./get-node.md) - [查询分段信息](./get-segment-info-cat-format.md) - [查询节点统计](./get-node-stats.md)