背景
促销是电商的基本功能,所以产品启动项目,促销指引。完成之后,开发同学觉得增加一个价格区间筛选,用户体验会更好。主动提出要增加此功能点。
算法
开发同学设计技术方案
设定6个区间段,可左右滑动。适用商品价格 (最高价格-最低价格 )/6,取整(只有首位数字,其余位数为0,例如,30,200)如果结果为个位,不进行区间分割。
例如,最低价格3.9 最高价格 499, 则(499-3.9)/6= 82.5166667 取整递增段应该为 80
区间段应该为,80以下 80-160 160-240 240-320 320-400 400以上
我作为测试,听到技术方案,提出问题,如果产品价格分布不太均匀,马上会出现某些区间段 筛选没有商品,用户体验很差。
开发自己反思:
当前的问题是使用等分区间,可能出现部分区间内无商品的 bad case。
可能的解决办法:
方案2,使用 elasticsearch 提供的 variable_width_histogram 聚合功能
实现比较简单
我们现在用的 elasticsearch 版本不支持,需要升级集群
可能效果也未必好(每个桶内的商品量相差很大),但是至少不会出现某个桶内无商品的情况
方案3,使用其他的基于统计的算法
https://jingpeicomp.gitbooks.io/search-platform/content/algorithm/number_section.html 推荐的
不一定能基于 elasticsearch 实现,比如 es 可能不提供方差/标准差这个聚合函数
看起来这个算法还是需要二次统计每个区间内的商品数量,那就要多查一次 es
对于这么一个小功能,实现有点太重,投入产出比低。
最终实现方案,
取 5% 到 95% 分位的价格,这两个价格差值等分作为价格区间
这个效果应该与基于标准差的估算类似,甚至更佳
统计每个区间内的商品数量,如果少于 6 个(一屏)则与高价格区间合并
增加价格区间合并,可以避免badcase
测试点
后端算法:
区间合并
空区间
正常区间分割
不需要分价格区间
前端ui及交互:
左右可滑动
点击区间 可正常筛选商品
和原有价格/销量 排序的耦合测试
针对后端算法设计测试case
discount1,商品9个,价格范围0-9.9元 7个+10000-15000 元 2个
discount2,商品13个,价格范围0-9.9元6个 +50-80元 1个+150-200元 6个
discount3,商品9个,价格范围0-9.9元5个 +50-80元 1个+150-200元 3个
总结
1,测试同学需要问清楚技术方案,才能设计相应的测试case,覆盖所有场景 避免盲目工作
2,测试case设计要尽可能精简,精准
3,开发同学不能想当然,轻视任何小的feature
4,培养模型抽象能力,leetcode 上算法题,给一个区间,分桶,让数字尽可能均衡。
用户体验,技术方案,产品需求,有时需要折中考虑。