天天看點

5年+ Elasticsearch 電商實戰經驗深度複盤

1、我的搜尋心路曆程

回顧自己過去的5年,從一名後端開發工程師,自我摸索、學習、探究,成為一名搜尋開發工程師。複盤總結自己經曆過的搜尋的三個階段,可簡要概括為:(1)關鍵詞搜尋、(2)相關性搜尋、(3)探索式搜尋。

具體如下圖:

5年+ Elasticsearch 電商實戰經驗深度複盤
  • 關鍵詞搜尋:主要借助關系型資料庫如Mysql 實作,搜尋效率低下、性能差、效果差強人意。
  • 相關性搜尋:借助 Solr 和 Elasticsearch 實作,基于規則文本分詞實作千人一面,對詞典和現有知識依賴較高。
  • 探索性搜尋:借助elasticsearch、Flink、milvus、Word2vec、TensorFlow實作,大資料和深度學習架構整合,符合使用者興趣習慣,真正實作了千人千面。達到了類似主流電商平台:京東、天貓、拼多多的效果。

2、搜尋架構

目前所在公司屬于電商行業,其搜尋大體流程上可以歸納為幾個階段 QU(query understanding)->召回->粗排->精排->重排,本文會對QU, 粗排,精排,重排過程簡要概述,重點講解 Elasticsearch 作為搜尋引擎在​

​電商搜尋流程​

​中的具體應用場景。

5年+ 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 補充相關性得分,語句如下:

{
"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,可以使用聚合的方式進行操作,具體語句如下:

{ "size":200,
    # 查詢語句 multi_fields
+ best_fields
    "query":{
      
    },
    "collapse":{
        "field":"goodsId"
    },
    "aggs":{
        "goods_count":{
            "cardinality":{
                "field":"goodsId"
            }
        }
    }
}      

4、寫在最後

做搜尋工程師久了之後,會覺得 Elasticsearch 在搜尋場景中的貢獻有限,尤其是當搜尋對NLP及排序算法越發依賴之後,越發有這樣的想法。但回想起來,Elasticsearch 的應用場景又不僅限于搜尋場景,包括但又不僅限于資料資料統計分析,多媒體資料向量檢索去重等。

在面對搜尋系統不斷進化的過程中,常常有這樣的感歎:技術日新月異,新技術永遠學不完,算法模型參與的場景越來越多,技術複雜度越來越高,這又何嘗不是網際網路行業的特點呢?但是我們技術人永遠都在面對變化不是麼?借用一句富含阿裡味的話:永遠不變的是變化。

但我應該如何去面對呢?我想我已經想好了自己的面對方法:深挖底層,方能立于不敗之地,深入了解資料結構,這樣當了解一門新的技術時才能靈活掌握快速上手,做到觸類旁通。做到極緻,把自己的事情做到極緻,或許會用不一樣的收獲。堅持努力,在自己熱愛的領域持續投入,因為我堅信日拱一卒,功不唐捐。

作者