作者:云钟
搜索是电商平台的核心流量入口,承载着平台主要的成交引导、意图收敛、活动投放。一个稳定、高效、可扩展的搜索系统是电商平台得以生存发展的基石。本文探讨如何构建完善的商品搜索系统,并根据闲鱼二手交易的差异化特性介绍闲鱼搜索系统的时效性优化。
一、 首先,构建一个搜索系统:电商场景的搜索
1. 搜索引擎
搜索系统的核心是搜索引擎,目前Lucene、ElasticSearch等开源引擎已十分成熟,阿里云也提供完整的搜索解决方案-OpenSearch,包含基于Ha3的搜索引擎(Heaven ask 3)及系列管控工具。这里,我们简单描述下搜索引擎内的基本概念作为导引,不过多深入引擎的具体实现(那将是一个冗长的话题,网络上的资料也随处可见)。
1) 搜索引擎的基本概念
• 分词
通过一定规则对文本分出单词,每个单词作为搜索的最小粒度单元。只有单词匹配,文档才能被召回,因此分词的准确是搜索精准的基础。如“红色摩托车”被分词成“红色”,“摩托车”,那它将被“摩托车”或者“红色”召回,如果分词成“红色摩托”,“车”,那它在引擎中被搜索出的概率就将大打折扣。
• 索引
。 _红色苹果手机,doc1_
。 _红色苹果,doc2_
。 “红色”,“苹果”->doc1,doc2
。 _“手机”->doc1_
。 倒排索引:称为反向索引、置入档案或反向档案,是一种索引方法。被用来存储在全文搜索下某单词在文档存储位置的映射。它是文档检索系统中最常用的数据结构。
。 正排索引:也叫attribute索引或者profile索引,是存储doc某特定字段(正排字段)对应值的索引,用来进行过滤、统计、排序或者算分使用。正排索引中“正"指的是从doc-> fieldInfo的过程。
。 索引内容类型:文本索引、空间索引、向量索引、数值索引。
• 排序方法
匹配召回的结果集,通过特定的排序规则呈现。这里的排序规则,可以是单一维度的排序(如按价格、销量、发布时间);人工设置的权重分;相关性得分;特定场景的模型打分等。
基于这三个基本概念,搜索动作就可以简化地理解为“利用搜索词的分词结果,通过倒排索引匹配相应的文档,并依据特定排序方法有序透出”的过程。
搜索引擎仅提供搜索的基础能力,现实环境下的搜索场景当然要复杂的多,一款地图搜索和一款商品搜索所面临的挑战大相径庭。作为原材料的搜索引擎,该打造成何种形状,就看面对问题如何去设计模具了。
以闲鱼为例,搜索系统的整体架构如下:
闲鱼搜索系统架构图
2. 在线服务
上述架构图中的步骤1~8为一次搜索请求的完整执行流程。
1) 请求接入模块->应用层
处理客户端或h5请求,请求接入模块的主要工作:参数校验、负载均衡、安全拦截。大部分的非法请求在这一层被拦截,避免进入系统核心模块后,导致不可预期的结果。应用层承载面向用户的业务逻辑:实际处理用户的业务请求,进行安全合规检测,同时并行请求投放的各类资源位。
2) 应用层->排序接入层
排序接入层是连接应用层与底层引擎的纽带,也是闲鱼搜索系统的最核心模块。他负责解析应用层的搜索请求,并对其进行合适流程编排:意图预测->请求拼串->搜索引擎召回->精排模型打分->重排规则->外部混排。
3) 排序接入层->意图预测模块
负责分词并预测搜索请求的实际意图,包括错词改写(例:平果->苹果)、同义词的合并(例:pingguo->苹果),类目预测(例:“苹果”出手机,还是出水果,它们各自的权重又是多少?)。
4) 排序接入层->搜索引擎
利用意图预测得到的信息,合并应用层参数,拼装出合法的搜索引擎请求,在搜索引擎内部历经“海选”、“粗排”、“精排”三个阶段,得到符合召回条件的商品集。
5) 排序接入层->精排模型打分
由于RT的限制,搜索引擎内部无法完成对海量商品复杂度较高的打分计算。这一步的工作,将引擎召回的商品集送入更精准的打分系统进行算分。为什么不把打分服务放在引擎内部?技术上是可行的,但由于打分服务变更频率频繁,而引擎相对稳定,处于系统迭代稳定性的考虑,独立拆分精排打分服务是更好的选择。
6) 排序接入层->混排模块
部分业务场景下,合作方有合并混排的诉求。独立拆分混排服务,隔离开发环境,让不熟悉主搜的外部开发同学在独立混排模块内做开发,即使服务异常,也不至于影响闲鱼本身的搜索能力。
7) 排序接入层->应用层
排序完成的商品列表,在应用层补充实时信息,如各类标签,促销信息等。同时,将商品搜索结果与广告等各类投放组装层最终的搜索结果页。
8) 应用层->接入层->客户端
将最终的搜索结果页返回到客户端或h5页面进行渲染。
3. 离线模块
与在线服务对应,搜索系统的离线模块负责数据的dump,清洗,索引构建。
1) 搜索引擎离线模块
• 全量索引(Fullindex):数据源来自多表join后的全量业务数据,包含所有商品信息,由buildSerive构建好索引后提供给Ha3使用,系统内仅有一份全量索引。
• 批次增量索引(IncIndex):根据周期内(通常30分钟到1小时)数据产出方发送的增量消息(如:商品修改信息),在BuildService上构建成索引段,定期发送给Ha3加载,引擎存在多段批次增量。
• 实时索引(RtIndex):将数据产出方实时生产的数据经中转Topic发送至Ha3,由Ha3引擎内的BS lib构建出实时索引加载使用,时效性为实时。在新的批次增量索引加载后,Ha3对实时索引作清理。
接下篇:https://developer.aliyun.com/article/1225878?groupCode=idlefish