多值字段复审与修复
2026-10-13 · 接续第 045 号回归之后的复审。
本轮改动
修复 lookup 多行匹配结果未被识别为多值字段的问题。stats、chart、timechart 可以逐值统计和分组;eval 复制后继续保留多值属性。OUTPUT 覆盖旧字段时同步更新属性,OUTPUTNEW 保留已有字段的属性。只产生单值的查找表输出继续使用原来的单值路径。
lookup users uid OUTPUT name AS a | stats dc(a) as d 匹配结果 x、y 和 z:以前 d=2,现在 d=3。
补上 stats、chart、timechart 的 dedup_splitvals 选项。显式设为 true 时,每条事件内重复的分组值只参与一次;不同事件即使内容相同,仍分别计算。多个多值分组字段保留所有独立组合。
| 查询 | 单条事件 a=x,x,y 的计数 |
|---|---|
| stats / chart / timechart 默认选项 | x=2,y=1 |
| dedup_splitvals=true | x=1,y=1 |
| dedup_splitvals=false | x=2,y=1 |
三个命令的官方默认值都是 false。此前进度消息中“chart/timechart 默认去重”的说法已纠正,不改变已有查询的默认重复计数行为。
验证
最终完整 tools/check_all.sh 已通过,并打印 CHECK_ALL PASSED:fmt、clippy、97 个单元测试、11 个 API 测试、冒烟测试和全部 47 个回归用例(含界面测试)。测试针对按最终运行代码重建的网关执行。
- 回归 046:lookup 的 dc、values、count、分组、chart、timechart、eval 复制、OUTPUTNEW、单值覆盖,以及多值数字字段 chart span 分桶。旧版网关出现 7 项失败,修复后全部通过。
- 回归 047:默认保留重复值、显式去重、两个多值分组字段的组合、相同事件分别计数、排序后的 first/last、分组去重与多值聚合同时使用。旧版不支持显式 dedup_splitvals 选项。
- 新增翻译器单元测试,并扩充 lookup JSON 生成器测试,检查多值输出属性。纠正回归 031 的旧断言:前两条事件的时间之和为 2H+1800,原断言误写成 2H+2400;改用整数比较,避免 %g 舍入掩盖差异。
- Cargo 检查在 osmanthe-check-env 容器内运行。构建、测试日志保存在 /tmp,不加入仓库。
剩余限制
- eventstats / streamstats 的多值聚合或分组仍直接报错;需要先 mvexpand。
- 显式分组去重需要事件编号、分组计数和排序,大量数据会增加时间与内存消耗;默认 false 没有新增这部分开销。
- 多值分组字段多时,组合数量仍会增长;本轮没有解决 30 天高基数统计的内存问题,也没有重跑 3 亿条压测。
- 全文搜索超时、上线前登录与 Key 管理、限流、写缓冲、查找表权限等原待办仍未完成;没有删除 demo 或 bench 数据。
- 未运行 Splunk 实例对照测试;兼容语义依据公开官方文档和本项目回归验证。
语义参考
以下三个官方页面的 dedup_splitvals 条目均说明默认 false,仅显式 true 时移除多值分组字段中的重复值。