5年+ Elasticsearch 电商实战经验深度复盘

2022-02-09 14:43:03 浏览数 (1)

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万 。

0 人点赞