没想到转行没做IT后,我竟然会有一天在自己的博客里更新代码方面的文章,因为我在建立这个网站的时候就有想过了,这只是我自己的一个小天地,只用来写写我的爱好(才不是因为过于简陋拿不出手),不过这么想我现在写这篇文章也是没有违背初衷的,技术现在它只为我服务了,想折腾时可以好好折腾部署服务供我使用,不想折腾时也没人催我给我设置Deadline,舒服!
首先写正文前,先免责声明一下,这篇文章的内容仅为个人经验与猜想,与真实情况可能有较大出入。
写这篇博客只是想提供一个从代码的角度来看电商平台搜索功能的视角,我觉得我在这个上还是有一些发言权的,因为我之前在一家公司做过多个自营电商平台的开发(虽然是基础框架二次开发并且换皮劣质平台
),就刚好负责过搜索模块的开发,在开始说这个之前,我觉得有必要先简单说下根据我目前所了解的目前各大主流电商平台所使用的搜索技术分别是什么。
一、国外主流电商平台的搜索技术
Amazon
核心技术栈:早期为Lucene/自研倒排,现在为高度定制的Lucene系搜索集群,深度融合了Learning to Rank(LTR)、用户画像+行为反馈、语义检索(embedding)
并不是使用的OpenSearch,虽然OpenSearch是AWS主导的开源项目,AWS又属于Amazon集团,但AWS是对外的云产品,而Amazon.com是内部的电商业务,这两条技术栈是分开的,Amazon不会在核心电商搜索上使用外部主导的开源项目、API稳定性不完全可控的系统以及社区演进节奏不可控的技术。
eBay
eBay明确公开过使用的是Elasticsearch+自研搜索层,强调实时索引以及大规模过滤(价格、属性)
典型的ES+强业务层架构
Alibaba
早期为Solr,现在使用的是自研搜索引擎(基于Lucene),并且是内部项目,电商搜索特点为强结构化+强规则,AliExpress偏规则+广告,Lazada偏推荐+本地化,1688/国际站偏信息检索+商机匹配
阿里集团使用的为魔改Elasticsearch,搜索系统=倒排召回+规则过滤+算法排序+广告系统
Shopee
技术背景为Sea集团公司Sea Limited(前身为Garena),搜索栈大概率为Elasticsearch或OpenSearch,强运营干预+规则排序
ES/OpenSearch+重运营逻辑,为什么这里介绍Sea公司时,必须提起一下他的前身Garena,Garena最早是一家游戏发行与运营公司,成立于2009年,核心能力是:游戏代理与本地化运营,社区、赛事、反外挂、账号体系,东南亚、拉美等新兴市场的用户运营;随着业务扩张,Garena已经不再只是游戏公司,有三个核心部门:游戏为Garena,电商为Shopee,金融科技为Seamoney。
Sea的技术气质就在于,他是用游戏公司的方式做电商和金融,极度重视高并发与稳定性、强数据驱动(A/B Test、实时指标)、偏向微服务+分布式系统、对新兴市场网络环境非常现实主义。
Shopify
Shopify的情况则比较灵活,因为Shopify本质是一个SaaS平台,它服务的是不同规模、不同品类、不同国家的商家,如果官方做一个“超级搜索算法”吃力不讨好,难以适配各种商家以及增加复杂度和不可控性,所以Shopify选择的是在官方搜索技术采用能用就行的地步,技术本体使用自研搜索服务,功能和目标费非常明确,保证中小商家开箱即用,而不是追求极致智能,更像是一个网站搜索,而不是电商搜索引擎。
Shopify官方提供一个“够用的基础搜索”,真正的搜索能力取决于你有没有上第三方搜索引擎。本体的搜索够用就好,差异化交给第三方的生态。
二、国内主流电商平台
淘宝/天猫
阿里系均为Lucene深度改造的自研搜索引擎,搜索/推荐/广告三位一体
阿里系均为早期使用Solr,中期魔改ES(放弃ES的原因是因为2021Elasticsearch商业化,云厂商全部开始切割),现在OpenSearch生态+阿里自研搜索体系
京东
早期(约2012-2015)使用的Solr,现在使用自研搜索引擎,但部分场景仍保留ES
Solr属于是很多国内平台的共同起点了,京东目前核心搜索业务使用的是自研搜索引擎,ES基本只负责工具层例如日志搜索、运营后台、BI/分析、部分垂直搜索(非商品主搜索)
拼多多
使用自研检索,强行为反馈+规则
拼多多不是传统搜索驱动型平台,搜索是工具,核心是推荐。搜索更多用于用户知道要买什么以及用户确认最低价和补贴。
抖音电商
使用自研搜索,向量召回+行为模型
搜索是推荐系统的一个子集,特征:在抖音搜索一个关键词,输出可能为视频、直播、商品,是一种语义检索+推荐模型中心化。
所以从上述各大平台使用的搜索技术来看,电商搜索更像一个实时广告竞价系统+搜索壳,而几乎所有平台都是使用的三段式的搜索结构:召回层(倒排/向量)-> 粗排(规则+特征)-> 精排(机器学习/广告模型)
这里我用我稍微熟悉的AliExpress的站内广告举例,如果我们把一次广告展示想象成一个函数调用:
onRequest(page, user, context) -> chooseAds() -> render() -> logImpression()
chooseAds()内部通常是4步:
召回(Recall):找候选广告
关键词:匹配query/泪目/词包
商品推广:同类目相似商品、热卖池
重定向:用户看过/加购过的商品池
过滤:地域、库存、配送、禁投类目、预算耗尽、店铺风险
粗排(Pre-rank):快速算个大概分
过滤掉明显不合格的(低质量、历史差、转化太差)
保留 Top N(比如几百到几千)
精排(Rank):算“谁排前面”,常见目标是最大化平台收益或 GMV
score = f(pCTR, pCVR, price, margin, bid, user_value, quality)典型近似是:
CPC 逻辑:eCPM = pCTR * bid(每千次展示预期收入)
若更看 GMV:score = pCTR * pCVR * price * weight + pCTR * bid * weight2
质量分会乘上去(防止垃圾广告靠出价上位)
竞价与定价(Auction/Pricing):多数电商广告用“二价/广义二价”思想
你排第 1,不一定按自己出价扣
常见扣费近似:
CPC_pay ≈ (next_score / your_pCTR) + epsilon目的:让你“出更高能更靠前”,但“实际扣费不至于直接满价”。
好,那么我们就把广告如何展示简单介绍了,接下来是预算与放量的问题,为什么会突然没量或者是突然起飞?
通常后台会有一个节流器(pacing),防止你预算过快的烧完:
if spend_today / budget_today > time_passed / day_length:
reduce_traffic() # 降低曝光机会
else:
normal_traffic()
所以可能会有这样的情况:
- 早上跑很猛 → 中午后变慢(系统在控节奏)
- 预算太小 → 只在转化最好的时段出量
- 新广告冷启动 → 需要探索流量(exploration)
因为很多系统用类似探索-利用(multi-armed bandit)的决策框架,也就导致了新投放的广告有冷启动与探索的时间,这也就意味着新计划前期数据容易飘:
- 新广告先给少量展示,估 pCTR / pCVR
- 如果表现好,快速扩量
- 如果表现差,逐步边缘化
if data < threshold:
traffic = exploration_quota
else:
traffic = traffic_by_score
又有个新问题,为什么同样的出价,你就是排不过别人呢?这跟商品的质量分有关系。
质量分一般来自:
相关性:相关性:标题/类目/属性是否匹配搜索意图
点击反馈:pCTR
转化反馈:pCVR、退款率、纠纷率
履约体验:发货、时效、物流妥投
商品健康:库存、价格稳定性、差评
所以最终排序更像:
final_score = bid * pCTR * quality_multiplier
好,说了这么多,终于要到我真正想写这篇博客的重点了,其实很简单,起因是今天下午和同事讨论为什么我广告烧不出去,同事说是因为我标题关键词没写好,说ebike、Ebike、ebikes和Ebikes是完全不同的词,当然这里我就不继续讨论到底是不是不同的词,因为哪怕是有1%可能那也是存在的,但我是更倾向于列举出来的这些词在搜索框是基本相同的,为什么呢?
这时我开篇写的这些不同平台使用的搜索技术就能派上用场了
,阿里系目前使用的搜索技术是基于Lucene自研的搜索引擎,那么他的工作原理基本就是商品的标题会作为数据源写入到中间层,这个中间层也就是阿里基于Lucene自演的搜索引擎,这个搜索引擎会使用分词器将数据源的文本进行分词操作,然后搜索引擎会记录切分后的每一个词项,与每一个数据源文本的ID对应关系并持久化存入磁盘,这样操作后,用户在搜索栏输入一个关键词后,搜索引擎只需要找到对应的词项就可以知道有哪些ID包含该关键词。这种操作是以空间换时间的操作,以大量的存储换取高效的查询。
在处理文本数据时,例如,用户搜索 “iPhone” 和 “iphone” 时,如果搜索引擎区分大小写,那么这两个查询可能会返回不同的结果。为了提供更加友好的搜索体验,搜索引擎是一定会实现大小写不敏感,关于模糊搜索就不用说了,他也是提高用户交互体验的例子之一,让你可以在“columbia”、“colombie”或“locombia”等条目上找到“colombia”这样的搜索词,从技术层面实现起来也并不难,并且是非常可控的,拿我曾经用过的Elasticsearch来说,要执行模糊查询,重要的是要理解ElasticSearch使用Levenshtein Edit Distance算法测量相似性,该算法定义为使一个词与另一个词相同所需的单个更改的数量。更改可以是插入、编辑或删除操作,ES也可以处理换位,没有那么复杂。
这里举两个例子:
colombia和columbia之间的Levenshtein距离是1,这是因为你只需要做一个修改:将单词columbia中的“u”换成“o”。
colombia 和columbi之间的Levenshtein距离是2,因为你只需要做两处修改:将单词columbia中的“u”换成“o”,并在单词末尾插入一个“a”。
所以但从代码和用户体验的角度来看的话,基本是能知道ebike、Ebike、ebikes和Ebikes他们在搜索系统里出来的结果都会是一样的,那么为什么实际上这些细微的差异出来的结果又会不一样呢?
因为你在搜索结果页看到的,其实是两条管线合流:自然搜索+搜索广告;自然搜索基于Lucene,排序目标位相关性+转化潜力+用户体验,并且不扣广告费,而搜索广告是独立的广告系统,由系统自己算pCTR/出价/质量分,最后强行插进搜索结果,所以你会看到明明相关性一般,但却排名很靠前的商品。
最后总结一下,AliExpress搜索有很强的交易导向,搜索是成交预测器,谁最有可能在你面前成交,就把谁推上来,技术层级:底层检索为自研搜索,中间层Query改写(同义词、拼写纠错、多语种)、商品理解(类目、属性、价格带),排序层为CTR、CVR、GMV预估、物流履约能力、平台策略权重(托管、本地仓、活动),速卖通的搜索有很强的人工规则+强制策略插队,因素可以是托管>非托管、本地仓>跨境直发、平台互动商品>普通商品,并且灰度实验密度极高,同一个关键词,不同用户看到的排序可能完全不同,在速卖通,搜索不是算法,而是凭条意志的数学表达。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mengziforever@qq.com