为了省空间把日志索引里三个 keyword 字段的 doc_values 设成 false,结果按 level 排序直接报错,terms 聚合返回空桶。字段数据本身是有值的。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,doc_values 是磁盘上的列式存储,排序、聚合、脚本访问都靠它。关掉之后正排信息不存在,这些操作没有可读的数据源。text 字段默认就没有 doc_values,只能开 fielddata,而 fielddata 吃堆内存。
「doc_values 关闭」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
GET logs/_disk_usage?run_async=false
PUT logs_v2/_mapping
{"properties": {"level": {"type": "keyword", "doc_values": true}}}
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,需要排序或聚合的字段保持 doc_values 开启;纯展示字段才考虑关掉 省下的空间按基数算;已经关掉的字段改 mapping 不生效 要新建索引;重建前用 _disk_usage 看这几个字段实际占多少。
最后用这个标准收尾,新索引上按 level 排序和聚合都正常返回,字段磁盘占用变化在预期范围内。
