当前位置: 首页 > ds >正文

【Elasticsearch】映射:fielddata 详解

映射:fielddata 详解

  • 1.fielddata 是什么
  • 2.fielddata 的工作原理
  • 3.主要用法
    • 3.1 启用 fielddata(通常在 text 字段上)
    • 3.2 监控 fielddata 使用情况
    • 3.3 清除 fielddata 缓存
  • 4.使用场景示例
    • 示例 1:对 text 字段进行聚合
    • 示例 2:对 text 字段进行排序
  • 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 字段上)

PUT my_index/_mapping
{"properties": {"my_text_field": { "type":     "text","fielddata": true}}
}

3.2 监控 fielddata 使用情况

GET _nodes/stats/indices/fielddata?fields=*

3.3 清除 fielddata 缓存

POST my_index/_cache/clear?fielddata=true

4.使用场景示例

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

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

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

GET my_index/_search
{"sort": [{"my_text_field": {"order": "asc"}}]
}

5.fielddata 与 doc_values 的区别

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

6.注意事项

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

7.最佳实践

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

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

    "my_field": {"type": "text","fields": {"keyword": {"type": "keyword"}}
    }
    

    然后对 my_field.keyword 进行操作。

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

http://www.xdnf.cn/news/13031.html

相关文章:

  • 【C++特殊工具与技术】优化内存分配(三):operator new函数和opertor delete函数
  • Linux多线程---线程池实现
  • STM32CubeMX-H7-20-ESP8266通信(下)-双单片机各控制一个ESP8266实现通信
  • LLMs 系列科普文(13)
  • 【Java实战】反射操作百倍性能优化
  • MyBatis原理剖析(一)
  • 人工智能学习08-类与对象
  • Python BeautifulSoup解析HTML获取图片URL并下载到本地
  • word中表格线粗细调整
  • 基于单片机的病房呼叫系统(源码+仿真)
  • Linux知识回顾总结----进程状态
  • 什么是ANSYS ACT? ACT又可以分为哪几类?
  • yaklang 中的各种 fuzztag 标签及其用法
  • 跟我学c++中级篇——多线程中的文件处理
  • Java网络编程:构建现代分布式应用的核心技术
  • day50 随机函数与广播机制
  • 基于Java Web的校园失物招领平台设计与实现
  • Redis——主从哨兵配置
  • ckeditor5的研究 (9):写一个自定义插件,包括自定义的toolbar图标、插入当前时间,并复用 CKEditor5 内置的 UI 组件
  • 2025年U盘数据恢复软件推荐:找回丢失文件的得力助手
  • 大数据赋能行业智能化升级:从数据价值到战略落地的全景透视
  • 网络渗透测试中的信息收集与网站目录扫描实战详解
  • Linux --进程控制
  • DHCP / DHCPv6 原理 / 报文解析 / 配置示例
  • Maven入门(够用)
  • Secs/Gem第九讲(基于secs4net项目的ChatGpt介绍)
  • 《光子技术成像技术》第四章 预习2025.6.8
  • 1. Web网络基础 - IP地址核心知识解析
  • 信号与传输介质
  • Linux 如何移动目录 (文件夹) (内含 Linux 重命名方法)