问题现象
在执行 Elasticsearch 聚合查询时,如果针对 text 类型的字段进行 Terms 聚合,经常会遇到如下错误:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
}
],
"status": 400
}
}
例如执行以下语句:
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}
原因分析
从 Elasticsearch 5.x 版本开始,为了节省内存,默认情况下 text 类型字段是不开启 Fielddata 的。聚合操作(如 Terms Aggregation)需要读取字段的倒排索引并加载到内存中进行计算,这会导致较大的内存开销。因此,系统默认禁用了该功能以防止 OOM(Out Of Memory)。
注意错误信息中的 [region] 实际上是指你当前正在聚合的那个字段名(示例中为 interests),而非固定的 region。
解决方案
如果你确定该字段适合用于聚合,并且有足够的内存资源,可以通过更新 Mapping 来显式开启 Fielddata。
使用 PUT 请求修改索引映射:
PUT /megacorp/_mapping/employee
{
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
返回 acknowledged: true 表示配置生效。之后再次执行聚合查询即可正常通过。
注意事项
开启 Fielddata 会显著增加堆内存的使用。在生产环境中,建议优先对 keyword 类型字段进行聚合。如果必须对 text 字段聚合,请确保监控节点内存使用情况,避免影响集群稳定性。
