Elasticsearch 映射 fielddata 工作原理解析

 更新时间:2025年06月11日 10:06:24   作者:G皮T  
在 Elasticsearch 中,fielddata 是一种在内存中构建的索引,用于加速某些类型的查询,特别是聚合和排序操作,下面通过本文给大家介绍Elasticsearch 映射 fielddata的相关知识,感兴趣的朋友一起看看吧

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 内存使用,设置合理的熔断阈值。

到此这篇关于Elasticsearch 映射 fielddata 工作原理解析的文章就介绍到这了,更多相关Elasticsearch 映射 fielddata 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何加密配置文件里的敏感数据

    如何加密配置文件里的敏感数据

    这篇文章主要介绍了加密配置文件里的敏感数据的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 详解如何使用Spring的@FeignClient注解实现通信功能

    详解如何使用Spring的@FeignClient注解实现通信功能

    SpringBoot是一个非常流行的Java框架,它提供了一系列工具来使这种交互无缝且高效,在这些工具中,@FeignClient注解因其易用性和强大的功能而脱颖而出, 在这篇文章中,我们将探讨如何使用Spring的@FeignClient注解进行客户端-服务器通信,需要的朋友可以参考下
    2023-11-11
  • Java调取创蓝253短信验证码的实现代码

    Java调取创蓝253短信验证码的实现代码

    这篇文章主要介绍了Java调取创蓝253短信验证码的实现代码,需要的朋友可以参考下
    2018-04-04
  • 关于Mybatis插入对象时空值的处理

    关于Mybatis插入对象时空值的处理

    这篇文章主要介绍了关于Mybatis插入对象时空值的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java ThreadLocal的使用详解

    Java ThreadLocal的使用详解

    ThreadLocal是线程私有的局部变量存储容器,可以理解成每个线程都有自己专属的存储容器,用来存储线程私有变量。ThreadLocal 在日常开发框架中应用广泛,但用不好也会出现各种问题,本文就此讲解一下。
    2021-05-05
  • Java实现的生成二维码和解析二维码URL操作示例

    Java实现的生成二维码和解析二维码URL操作示例

    这篇文章主要介绍了Java实现的生成二维码和解析二维码URL操作,结合实例形式分析了Java创建与解析二维码,以及文件读写等相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • java中switch选择语句代码详解

    java中switch选择语句代码详解

    这篇文章主要介绍了java中switch选择语句代码详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 新手Hadoop安装 环境搭建

    新手Hadoop安装 环境搭建

    这篇文章主要介绍了Hadoop的安装与环境搭建教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下,希望能给您带来帮助
    2021-06-06
  • Java版超大整数阶乘算法代码详解-10,0000级

    Java版超大整数阶乘算法代码详解-10,0000级

    这篇文章主要介绍了Java版超大整数阶乘算法代码详解-10,0000级,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Spring Boot 整合 Apache Flink 的详细过程

    Spring Boot 整合 Apache Flink 的详细过程

    Apache Flink 是一个高性能的分布式流处理框架,而Spring Boot提供了快速构建企业级应用的能力,下面给大家介绍Spring Boot 整合 Apache Flink 教程,感兴趣的朋友一起看看吧
    2025-06-06

最新评论