Kibana 基于脚本语言解析聚合动态表内工时总数值的方案咨询
工时字段解析聚合实现方案
你当前存储的Hours Worked字段为字符串类型,无法直接做数值聚合,需先完成字段类型适配,再执行聚合操作,以下是两种可行方案:
方案1:使用Runtime Field临时适配(无需修改原有索引,适合快速验证需求)
- 进入Kibana的「Stack Management > 索引模式」,找到存储工时数据的对应索引模式
- 点击「运行时字段」选项卡,选择「添加运行时字段」
- 自定义字段名(如
hours_worked_num),类型选择「整数」,在「定义脚本」处输入以下Painless脚本:
if (doc.containsKey('Hours Worked') && !doc['Hours Worked'].empty) { emit(Integer.parseInt(doc['Hours Worked'].value)) } else { emit(0) }
- 保存字段后即可用该数值型字段做各类聚合计算
方案2:修改索引Mapping永久生效(适合长期使用,聚合性能更优)
注意:reindex操作前请先备份原有索引数据,避免操作失误导致数据丢失
- 先创建新索引,指定
Hours Worked为整数类型,示例Mapping配置:
{ "mappings": { "properties": { "dateweeklycomments": {"type": "date"}, "Teammember": {"type": "keyword"}, "Role": { "properties": { "name": {"type": "keyword"} } }, "Hours Worked": {"type": "integer"} } } }
- 调用reindex接口完成旧数据迁移与类型转换,示例请求:
POST _reindex { "source": {"index": "你的旧索引名称"}, "dest": {"index": "你的新索引名称"}, "script": { "source": "ctx._source['Hours Worked'] = Integer.parseInt(ctx._source['Hours Worked'])" } }
- 迁移完成后将原有索引模式关联到新索引,后续新增数据也会自动按数值类型存储
常见工时聚合操作示例
- 按成员统计总工时:在Kibana Dashboard创建「数据表格」可视化,桶选择「Terms聚合」,字段选
Teammember,指标选「Sum聚合」,字段选择数值类型的工时字段即可 - 按周统计全团队总工时:桶选择「Date Histogram聚合」,字段选
dateweeklycomments,时间间隔选「周」,指标选Sum工时字段 - 按角色统计人均工时:先添加Terms聚合选
Role.name,再添加Sum工时聚合和「Cardinality聚合」统计成员数,通过自定义公式总工时/成员数计算人均值
内容的提问来源于stack exchange,提问作者prohit
相关产品推荐
相关产品推荐

