当前位置: 代码网 > it编程>游戏开发>ar > Elasticsearch 映射 fielddata 工作原理解析

Elasticsearch 映射 fielddata 工作原理解析

2025年06月11日 ar 我要评论
1.fielddata 是什么fielddata 是 elasticsearch 中一种数据结构,用于在内存中缓存字段数据,主要服务于以下场景:聚合操作(aggregations)排序(sorting

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 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com