Scanner le code QR Télécharger le code QR
Boutique de domaines
empêcher l'interception des liens
Sélectionner les types de plateformes autorisés

如何从0到1搭建搜索系统(一)

假期突然变长,一觉醒来又多了几天休息,这种“在家办公”的日子真的来了,反倒让人有点不知所措。趁着周末空闲,不如顺手了解一下搜索系统是怎么搭建的——既能打发时间,也能攒个实用技能。这篇文章就用最直白的方式,把搜索系统的基本结构梳理一遍,帮产品小白快速建立起认知,甚至能照着搭出一个够中小电商平台用的搜索系统。如果能帮到一两个朋友,就算没白写。也欢迎对搜索感兴趣的伙伴一起讨论,共同进步。

但凡商品数量多一点、用户期望高一点的电商平台,都在做自己的搜索。一方面是商品越来越多,业务对搜索能力的要求自然水涨船高;另一方面,自建搜索最大的好处,就是商品排序可以完全按照自己的运营策略来调,而且对商品价格、库存这类敏感信息的保密性也更好,对某些电商来说这一点尤其重要。

电商搜索有两个绕不开的指标:搜索精度和搜索广度。精度看的是结果有多准,广度看的是覆盖得有多全。有人可能会问,既然要求搜得准,为什么还要管广度?关键就在于商品丰富度。再大的平台,也不可能覆盖用户想买的所有东西。如果一味追求精度,只把最匹配的几个商品推出来,用户搜完一看,才三五个结果,甚至直接“没有找到相关商品”,那种感觉就像逛了一家空荡荡的店,平台商品显得特别单薄,用户大概率扭头就走了。用户搜不到东西,损失是实实在在的。所以,一方面得催着销售同学赶紧把商品丰富起来,另一方面,搜索侧能做的,就是适度给用户露出一些相关商品,哪怕不是百分之百精准,至少能留住人,给个替代选项。因此,搜索做得好不好,本质上就是在精度和广度之间,找到最适合当前平台体量的那个平衡点。

搜索这件事,拆开来看主要就三步:分词、数据查询、数据排序。有一张很直观的搜索架构图,我重新画了一下。用户输入关键词,系统先把它拆成一个个有意义的词,再拿着这些词去匹配商品数据、库存数据、营销活动、订单信息等等,捞出一批候选商品。最后,按照相关性、销量、折扣力度、用户历史订单甚至浏览偏好等维度,把这些商品排出合理的顺序,呈现在用户面前。整个过程说起来简单,但每一步都有不少细节。

很多人刚接触搜索时不理解,为什么非要分词?直接把用户输入的关键词拿去找商品不行吗?还真不行。因为用户输入的文字是一个整体,如果不拆开,系统就很难理解哪个词才是重点,也就没法从海量商品里快速圈定范围,再根据那些修饰性的词去做筛选,最后给出准确的结果。举个栗子:用户搜“进口红鸟鞋油”。如果没有分好词,搜索引擎很可能把“红”和“鸟”甚至“口红”联系起来,给你推一堆口红,这显然全错了。而正确分词之后,系统能识别出“鞋油”是核心词,“红鸟”是一个品牌词,权重可能有0.8,“进口”只是一般属性词,权重可能只有0.1。这样搜出来的结果自然就靠谱了。

分词这部分,主要包含建立词库、词义分析、搜索纠错三件事。用户搜完关键词,系统会先通过搜索监控把数据整理干净,去掉一些乱码和无意义的符号,然后靠词库和分词服务,把关键词切成最小粒度,再做语义分析,给每个词分配权重,分析出主次关系。而且,光有主次词还不够,关键词会被从平面的一句话拆成几个维度,从多维度、多属性去做立体的商品查询。

垂直电商平台的词库,决定了用户搜索词会按什么规则被切分。如果词库里只有“猪肉”这个词条,那用户搜“猪肉保存”,结果就会拆成“猪肉”和“保存”;如果词库里同时有“猪肉保存”这一整条,那它就会被当成一个完整的词直接匹配。所以你看,词库里有什么,直接决定了分词长什么样。建词库需要用大量用户搜索数据来积累,不可能一蹴而就。一开始就自建词库,成本高、见效慢,搜出来的结果还常常不准,这一点也不奇怪。但为什么很多垂直电商还是坚持自己建?因为自建的词库可以深度贴合自己平台上的商品,把搜索精度提上去。比如一个卖二手手机的平台,完全可以把大量的手机参数、型号加进词库。用户搜“A1865”,如果词库里已经有这个词条,系统就会把它当成一个完整的词去搜索,进而让用户更方便地通过搜索引擎找到iPhone X国行版和港版。这种精准度,通用词库很难做到。



词义分析,说白了就是通过NLP理解用户输入的关键词到底想表达什么,找出中心词,再给不同类型的关键词打分、分配权重。拿一个常见的大厂通用实体识别接口来模拟一下,搜“阿玛尼真丝绒哑光唇釉”。分词结果里,通常会包含类别词“唇釉”、品牌词“阿玛尼”、属性词或修饰词“真丝绒”“哑光”,权重也依次下降。这就能看出来,自建词库时,除了可以接入网上现成的开源词条,更重要的是根据自己平台商品的属性去扩展词条,比如把品牌词、品类词、型号词、材质词等等都系统地管起来。



在分词结果中,你可能会看到“synonym”字段里出现“amani;阿妈尼;armani jeans;阿码尼;emporio armani;armani”这一串。其中“阿妈尼”“阿码尼”就是搜索纠错的产物。搜索纠错就是为了避免用户因为输入法问题、口耳相传的叫法不同,而搜不到想要的东西。它通常分为同义词、近义词、错别字、屏蔽词几种情况。同义词最常见的就是中英文、别名,比如armani和阿玛尼,“amani”这种全拼也可以算同义词,还有YSL和杨树林这种民间叫法。近义词的边界比较模糊,毕竟每个人对“近义”的理解不一样。近义词更多是为了增加搜索广度。比如猕猴桃很少或者卖完了,搜猕猴桃的时候能顺带出一些奇异果,不至于让用户觉得“这个平台什么都没有”。所以为了搜索广度,我们会把相似的两个词加上关联,减少那种搜无可搜带来的糟糕体验。错别字也常见,用户输入时难免手滑,打错字。如果不做自动纠错,“阿码尼”就会被拆成“阿”“码”“尼”,根本不会被当成品牌词“阿玛尼”来处理,搜出来的结果自然一塌糊涂。而屏蔽词则是针对一些用户搜关键词时混进去的无意义乱码或标点,为了避免这些东西干扰搜索结果、扰乱权重计算,系统会先把它们屏蔽掉,只保留有效的文本。

搜索系统本身是个庞杂的工程,一篇实在讲不完。这次先拆解了最为核心的分词部分,下一回,我们再接着聊数据查询和排序的那些事儿。如果你对后续内容感兴趣,不妨一起动手试试,搭个简单的搜索系统,其实比想象中容易上手。