【Elasticsearch】映射:fielddata 详解

映射:fielddata 详解

  • [1.fielddata 是什么](#1.fielddata 是什么)
  • [2.fielddata 的工作原理](#2.fielddata 的工作原理)
  • 3.主要用法
    • [3.1 启用 fielddata(通常在 text 字段上)](#3.1 启用 fielddata(通常在 text 字段上))
    • [3.2 监控 fielddata 使用情况](#3.2 监控 fielddata 使用情况)
    • [3.3 清除 fielddata 缓存](#3.3 清除 fielddata 缓存)
  • 4.使用场景示例
    • [示例 1:对 text 字段进行聚合](#示例 1:对 text 字段进行聚合)
    • [示例 2:对 text 字段进行排序](#示例 2:对 text 字段进行排序)
  • [5.fielddata 与 doc_values 的区别](#5.fielddata 与 doc_values 的区别)
  • 6.注意事项
  • 7.最佳实践

1.fielddata 是什么

fielddata 是 Elasticsearch 中一种数据结构,用于在内存中缓存字段数据,主要服务于以下场景:

  • 聚合操作(Aggregations)
  • 排序(Sorting)
  • 脚本计算(Scripting)
  • 某些类型的查询 (如 field 字段上的 term 查询)

当需要对 text 字段或其他非 doc_values 支持的字段执行上述操作时,Elasticsearch 需要将这些字段的值加载到内存中,这就是 fielddata 的作用。

2.fielddata 的工作原理

  • 按需加载:当第一次需要对某个字段执行聚合 / 排序等操作时,Elasticsearch 会从磁盘读取该字段的所有值并构建内存中的数据结构。
  • 存储在 JVM 堆内存fielddata 会占用 JVM 堆内存空间。
  • 字段级启用 :默认情况下,text 字段禁用 fielddatakeyword 字段使用 doc_values 而非 fielddata

3.主要用法

3.1 启用 fielddata(通常在 text 字段上)

json 复制代码
PUT my_index/_mapping
{
  "properties": {
    "my_text_field": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

3.2 监控 fielddata 使用情况

json 复制代码
GET _nodes/stats/indices/fielddata?fields=*

3.3 清除 fielddata 缓存

json 复制代码
POST my_index/_cache/clear?fielddata=true

4.使用场景示例

示例 1:对 text 字段进行聚合

json 复制代码
GET my_index/_search
{
  "size": 0,
  "aggs": {
    "my_terms": {
      "terms": {
        "field": "my_text_field"  // 需要该字段启用 fielddata
      }
    }
  }
}

示例 2:对 text 字段进行排序

json 复制代码
GET my_index/_search
{
  "sort": [
    {
      "my_text_field": {
        "order": "asc"
      }
    }
  ]
}

5.fielddata 与 doc_values 的区别

特性 fielddata doc_values
构建时机 查询时按需构建 索引时预先构建
存储位置 JVM 堆内存 磁盘(操作系统缓存)
内存占用
适用字段类型 主要为 text 字段 主要为 keyword / numeric / date 等字段
默认启用 text 字段默认禁用 支持的字段默认启用

6.注意事项

  • 内存消耗fielddata 会显著增加内存使用,特别是高基数(大量唯一值)字段。
  • 性能影响 :首次加载 fielddata 可能导致查询延迟。
  • 替代方案 :对于 keyword / numeric / date 等字段,优先使用 doc_values
  • 熔断机制 :Elasticsearch 有 fielddata 熔断器防止内存耗尽。

7.最佳实践

  • 尽量避免在 text 字段上启用 fielddata

  • 如需对文本进行聚合/排序,考虑使用多字段(multi-field)映射:

    json 复制代码
    "my_field": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }

    然后对 my_field.keyword 进行操作。

  • 监控 fielddata 内存使用,设置合理的熔断阈值。

相关推荐
gptplusplus8 分钟前
超越自动化:为什么说供应链的终局是“AI + 人类专家”的混合智能?
大数据·人工智能
hqyjzsb12 分钟前
2025职场进阶:B端产品经理必备的计算机专业技能精要
大数据·开发语言·人工智能·产品经理·编程语言·caie
Arthurmoo13 分钟前
Git常用命令大全:高效开发必备
大数据·elasticsearch·搜索引擎
桐果云5 小时前
解锁桐果云零代码数据平台能力矩阵——赋能零售行业数字化转型新动能
大数据·人工智能·矩阵·数据挖掘·数据分析·零售
数科星球8 小时前
AI重构出海营销:HeadAI如何用“滴滴模式”破解红人营销效率困局?
大数据·人工智能
萤丰信息11 小时前
智慧工地如何撕掉“高危低效”标签?三大社会效益重构建筑业价值坐标
java·大数据·人工智能·微服务·重构·架构·智慧工地
数说故事11 小时前
数说故事 | 2025年运动相机数据报告,深挖主流品牌运营策略及行业趋势
大数据·人工智能·aigc·数说故事
boonya11 小时前
大数据框架Doris全面解析
大数据
财经三剑客13 小时前
追觅极境冰箱震撼上市:以首创超低氧保鲜科技打造家庭健康中心
大数据·人工智能·科技
SEO_juper13 小时前
E-E-A-T与现代SEO:赢得搜索引擎信任的完整策略
前端·搜索引擎·seo·数字营销·seo优化·谷歌seo