1、我的搜索心路历程
回顾自己过去的5年,从一名后端开发工程师,自我摸索、学习、探究,成为一名搜索开发工程师。复盘总结自己经历过的搜索的三个阶段,可简要概括为:(1)关键词搜索、(2)相关性搜索、(3)探索式搜索。
具体如下图:
- 关键词搜索:主要借助关系型数据库如Mysql 实现,搜索效率低下、性能差、效果差强人意。
- 相关性搜索:借助 Solr 和 Elasticsearch 实现,基于规则文本分词实现千人一面,对词典和现有知识依赖较高。
- 探索性搜索:借助elasticsearch、Flink、milvus、Word2vec、TensorFlow实现,大数据和深度学习框架整合,符合用户兴趣习惯,真正实现了千人千面。达到了类似主流电商平台:京东、天猫、拼多多的效果。
2、搜索架构
当前所在公司属于电商行业,其搜索大体流程上可以归纳为几个阶段 QU(query understanding)->召回->粗排->精排->重排,本文会对QU, 粗排,精排,重排过程简要概述,重点讲解 Elasticsearch 作为搜索引擎在电商搜索流程
中的具体应用场景。
2.1 QU(query understanding)
目的:关键词合理分词,理解关键词意图。
用户搜索时,搜索系统通常会对搜索词先做分词处理,然后经过搜索引擎(ES)进行相似度计算,召回相关doc。但会出现以下badcase难以处理:
- 错词:用户输入错误导致搜索无结果;
- 同义词:如中英文、简拼等;
- 口语化词。所以会引入NLP工程师通过算法做更进一步的Query理解,通常有词性识别,实体识别,意图识别,词权重等流程。
2.2 召回
目的:提升搜索效率、挖掘潜在相关商品。
召回模块需要尽可能多的召回商品,除结合文本相关性之外,通常还会结合用户行为偏好,热榜高质量商品,向量检索,等多种方式尽可能召回相关商品。
2.3 粗排
目的:粗选高质量,相关度高商品,降低精排模型压力。
召回模块的召回结果通常是成千上万的,而精排模型受制于模型复杂度,资源,性能等要求,往往仅能支持数百商品同时预测,所以需要对召回候选集加以处理。
汇总商品质量分、意图分、实体分、文本分,然后通过打分公式,计算汇总每个商品的分数,最终对召回结果取 topN
,从而达到从召回结果选取相关度高,质量高,符合关键词意图和实体识别结果,成交效率高的 TopN
商品,最终输入精排模型。
2.4 精排
目的:结合用户行为,商品特征进行二次排序。
排序引擎会结合用户的静态特征,实时行为特征和商品特征,输入排序模型,预测用户的点击、加购、成交概率,然后通过精排公式进行二次算分
,最终得出商品的精排分数。
2.5 重排
目的:结合产品及关键词特点,最终处理。
经过粗排,精排后的商品有时候会存在商品类目或标签集中分布,头部商品过度曝光等特点,为保证展示结果的多样性,公平性,往往需要对列表结果进行重排,通常的打散重排方法有分桶法
,滑动窗口法
,多权重打散
等方法。
3、Elasticsearch在搜索过程中的应用
Elasticsearch 在我司电商搜索中主要应用在以下场景:
3.1 多路召回
结合 QU
结果,扩展多路召回,丰富召回结果集。
- 文本召回
搜索词与搜索字段域相关性计算(ES multi_fields)。
- 意图召回
搜索词类目,品牌,人群,性别,属性召回。
- 实体召回
品牌,类目,标签等召回。
- 向量召回
基于向量相似度召回相关商品。
- 用户行为召回
聚合用户的类目,品牌,地域等信息,召回一批高度相似的商品。
3.2 补充相关性得分
多路召回中的热榜商品召回,离线模型等召回路结果通常是离线计算所得,无法实时匹配关键词及筛选条件,需要经过 Elasticsearch 补充相关性得分,语句如下:
代码语言:javascript复制{
"size":200,
"query":{
"bool":{
"must":[
{
"bool":{
"should":Array[3], 搜索强制过滤条件
"adjust_pure_negative":true,
"boost":1
}
},
{
"dis_max":{ 文本相关性查询语句
"tie_breaker":0,
"queries":Array[1],
"boost":1
}
}
],
"filter":[
{
"term":{ 过滤条件1
"status":{
"value":0,
"boost":1
}
}
},
{
"term":{ 过滤条件2
"color":{
"value":0,
"boost":1
}
}
}
],
"adjust_pure_negative":true,
"boost":1
}
},
"_source":{
"includes":Array[10], ES结果展示的字段
"excludes":[
]
},
"sort":Array[3], 排序条件
"track_scores":true,
"track_total_hits":2147483647,
"collapse":{
"field": "goodsId" 对搜索结果去重取样
}
}
3.3 商品打散抽样
通过使用 collapse
对搜索结果进行去重取样,可以达到商品去重的目的。
但需注意此时搜索结果的total 是取样之前的 total,如需准确获取 total,可以使用聚合的方式进行操作,具体语句如下:
代码语言:javascript复制 { "size":200,
# 查询语句 multi_fields
best_fields
"query":{
},
"collapse":{
"field":"goodsId"
},
"aggs":{
"goods_count":{
"cardinality":{
"field":"goodsId"
}
}
}
}
4、写在最后
做搜索工程师久了之后,会觉得 Elasticsearch 在搜索场景中的贡献有限,尤其是当搜索对NLP及排序算法越发依赖之后,越发有这样的想法。但回想起来,Elasticsearch 的应用场景又不仅限于搜索场景,包括但又不仅限于数据数据统计分析,多媒体数据向量检索去重等。
在面对搜索系统不断进化的过程中,常常有这样的感叹:技术日新月异,新技术永远学不完,算法模型参与的场景越来越多,技术复杂度越来越高,这又何尝不是互联网行业的特点呢?但是我们技术人永远都在面对变化不是么?借用一句富含阿里味的话:永远不变的是变化。
但我应该如何去面对呢?我想我已经想好了自己的面对方法:深挖底层,方能立于不败之地,深入了解数据结构,这样当了解一门新的技术时才能灵活掌握快速上手,做到触类旁通。做到极致,把自己的事情做到极致,或许会用不一样的收获。坚持努力,在自己热爱的领域持续投入,因为我坚信日拱一卒,功不唐捐。
作者
作者:Hello郎,Elastic 认证工程师,某电商平台资深搜索工程师。
审稿人:铭毅天下,Elastic 认证工程师,Elastic 中国合作培训讲师,阿里云 MVP,Elastic Stack 技术博文全网累计阅读量 1000万 。