字段数据参数(Fielddata)

Fielddata 参数 #

fielddata 参数控制 text 字段是否可以用于排序、聚合和脚本。

默认情况下,text 字段不支持排序和聚合——因为 text 字段使用倒排索引,按词项而非完整值存储,无法高效地做正排查找。fielddata 通过将整个倒排索引加载到 JVM 堆内存来实现这一功能,但这 非常消耗内存,通常不推荐使用。

相关指南(先读这些) #

参数选项 #

说明
false禁用 fielddata。对 text 字段执行排序/聚合会报错。默认值
true启用 fielddata。允许对 text 字段排序和聚合,但会大量消耗堆内存。

示例 #

PUT my-index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "fielddata": true
      }
    }
  }
}

⚠️ 警告:在生产环境中启用 fielddata 可能导致大量内存消耗,甚至触发断路器(circuit breaker)或 OOM。

更好的替代方案 #

需求推荐方案说明
对字符串做排序/聚合使用 keyword 子字段"fields": { "raw": { "type": "keyword" } }
对字符串做全文搜索 + 聚合text + keyword 多字段搜索用 text,聚合用 keyword 子字段
确实需要对分词后的词项做聚合fielddata + fielddata_frequency_filter过滤低频词项,减少内存开销

fielddata_frequency_filter #

如果确实需要使用 fielddata,可以通过频率过滤减少内存占用:

PUT my-index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "fielddata": true,
        "fielddata_frequency_filter": {
          "min": 0.01,
          "max": 0.5,
          "min_segment_size": 500
        }
      }
    }
  }
}
参数说明
min词项最低频率(占比),低于此频率的词项不加载
max词项最高频率(占比),高于此频率的词项不加载
min_segment_size分段最小文档数,小于此值的分段不加载 fielddata

fielddata 与 doc_values 的对比 #

特性fielddatadoc_values
适用类型text 字段keyword、数值、日期等
存储位置JVM 堆内存(查询时加载)磁盘(索引时构建)
内存消耗⚠️ 非常大✅ 极低
默认状态关闭开启
推荐度❌ 不推荐✅ 推荐