1、 问题描述
为什么开单模糊检索商品时,商品没有按照商品编码由小到大排序?
回答:这个不是程序问题,而是根据目前商品检索的逻辑返回的结果。
下面我们先说明一下星辰商品模糊搜索的逻辑,再通过案例来理解这个逻辑的实现效果:
2、 场景介绍:
在食品酒水、五金建材、医疗器械等存在非常多名称、规格相似的商品时,开单模糊检索时非商品编码的时候,经常会遇到查询结果排序不是按商品编码升序排序的情况。
3、 逻辑说明及解决方案:
一、名词解释:
前台:就是网站前台,例如在PC端、移动端所能直接看到的页面。
后台:就是前台看不到的地方,可以查看、修改代码的地方,例如数据库。
匹配度:就是跟模糊搜索关键字完全相等。例如:搜索 “草莓”,那么在下拉列表中匹配度最高(也就是包含或者等于关键字“草莓”)的字段就是【商品名称】。
字符长度:即字符串的长度,包括字母、数字、运算符号、标点符号等等。例如:牛奶(草莓味),字符长度是7位(括号也算是字符)。
升序:即从小到大排序。
二、下拉列表检索逻辑说明:
星辰开单模糊搜索时,下拉列表中前台查询与后台查询返回的值的规则是不一样的:
敲黑板,划重点!!!!:
只有当商品数量大于2w5时,下拉列表模糊检索时,才会跟商品资料列表的查询结果一致。
之所以有2套的不同逻辑,是鉴于搜索的性能考虑,当商品少的时候,走前台查询逻辑速度会更快,而当商品非常多时,会走后台的到数据库查询,所以耗时会更久些。
本文主要重点说明,将当商品数量少于2w5时的检索逻辑。也就是最开始反馈的问题“为什么开单模糊检索商品时,商品没有按照商品编码排序?”
前台检索的优先级及返回规则:
优先级1:按区分大小写字母检索,取匹配度最高的字段串长度升序排序,字符长度相同的情况下,按商品编码排序。
优先级2:按不区分大小写字母检索,取匹配度最高的字段串长度升序排序,字符长度相同的情况下,按商品编码排序。
最终返回结果:先按优先级1检索,直到检索完所有符合的结果后,再按优先2检索。最终显示在下拉列表的排序就是把优先级1+优先级2所有筛选结果,按照所匹配的字段串长度由小到大排序。
三、案例说明与应用:
下面通过销售订单开单的下拉列表进行说明,注意,下文案例都是商品没有超过2.5w的。
假设有商品某饼干若干个口味,信息如下:
销售开单时,搜索 “好吃的”时,显示结果如下:
说明:因为录入的就是中文,不存在大小区分,那么直接取匹配度最高字段,那么就是“商品名称”,而商品名称中,根据字符串长度升序排序,长度相同的情况下,按商品编码升序排序。
假如还是上面的商品信息,销售开单时,搜索 “chchbg”时,显示结果如下:
说明:因为录入的是小写英文,那么取匹配度最高字段就是“助记码”,而助记码中,根据字符串长度升序排序,长度相同的情况下,按商品编码升序排序,刚好跟按商品名称搜索时一样的结果。
1) 商品编码跟助记码大小写不一致
还是跟上面案例一样的商品,商品编码跟助记码大小写不一致时,
销售开单搜索 “CHC”时,显示结果如下:
说明:因为录入的是大写英文,那么取匹配度最高字段就是“商品编码”,而且商品编码的长度都相同,故直接按商品编码升序了。
2) 商品编码跟助记码大小写一致
如果商品编码跟助记码都是一样大写/大小英文的格式,
那么销售开单时,搜索 “chcd”时,显示结果如下:
说明:此场景中,商品编码跟助记码都是小写英文,那么在这种情况下,优先匹配商品编码,而且商品编码的长度都相同,故直接按商品编码升序了,看到的结果就跟商品资料列表是一样的结果了。
场景四:其他匹配场景
按规格型号、品牌等等字段的检索也是一样的逻辑,下面就不再一一列举了。
四、搜索建议
如果希望下拉列表显示按商品编码排序,建议:
1、尽量精确查询,直接按商品编码中的字母检索,保持相同的大写或小写格式;
如上文案例的商品“超好吃的饼干夹心草莓200g”,搜索时录入商品编码“CHCD”.
2、如果开单时习惯使用助记码搜索,建议缩短助记码长度
如果用小写字母检索,由于【助记码】默认都是小写字母,所以会优先先匹配【助记码】,如果有大量的商品名称非常相似且名称很长,那么【助记码】也会非常长,这个会导致按【助记码】匹配时,排序很靠后,导致在下拉列表展示时,可能要往下滚动很久才能找到,建议缩短【助记码】的长度,保留关键信息检索即可,这样检索时,就会优先排在下拉列表的前面。
如:商品“超好吃的饼干(夹心草莓)200g”的助记码正常是chcdbg(jxcm)200g可以改成chcdjxcm
3、如果开单不使用助记码搜索,建议商品编码跟助记码保持一样
如果开单不使用助记码搜索,希望无论大写还是小写都能按商品编码模糊检索,建议通过批量引入,把商品资料中的“助记码”都改成跟“商品编码”一样的信息,这样模糊检索结果就是直接跟商品列表显示的结果一样了。
如上文案例的商品“超好吃的饼干夹心草莓200g”的助记码可以改成跟商品编码一样“chcd0001”。