本文將介紹如何使用阿里云OpenSearch基于電商場景構建出一個簡單的商品搜索原型,從而滿足業務對商品搜索的需求。在構建類似電商平臺建設中,有一塊重要的業務要求是可通過關鍵字搜索的方式對商品信息中不同屬性進行搜索,同時可對搜索出的商品列表進行分類的過濾,采用阿里云OpenSearch產品實現一個商品搜索的原型,能很好的滿足項目的需求。
環境準備
第一次開通阿里云賬號并登錄控制臺時,會提示先創建access key才能繼續使用。
創建及使用應用依賴access key參數,主賬號下access key參數不能為空。
在為主賬號創建access key參數后,還可以再創建RAM子賬號access key通過RAM子賬號進行訪問,RAM子賬號賦予對應訪問權限,請參考授權訪問鑒權規則。
基本架構
整個原型的系統架構如下:
創建應用
1.登錄阿里云OpenSearch控制臺,在左側導航欄單擊實例管理,在實例管理頁面單擊左上角創建實例:
2.選擇應用類型:
本文基于電商場景下,涉及多表關系映射,所以選擇支持簡單多表join邏輯的高級版應用類型。關于應用類型的詳細介紹請參考OpeanSearch應用類型說明。
3.填寫應用信息:
選擇商品類型:目前系統支持預付費和后付費,具體區別可參考:計費方式與價格。選擇地域和可用區域:目前OpenSearch支持的可用區域有
中國區域:華南1、華北1、華北2、華北3、華東1、華東2、中國香港
亞太區域:新加坡
歐洲與美洲區域:德國(法蘭克福)、美國(弗吉尼亞)
應用名:應用名由以英文字母開頭的數字、英文字母或下劃線組成,長度不超過 30 個字符 ;注意:應用名稱創建后無法修改!應用類型:高級版、標準版。購買規格:目前OpenSearch支持的有共享通用、共享計算、共享存儲、獨享通用、獨享計算、獨享存儲,詳情可參考:計費方式與價格。存儲容量和計算資源:按實際而定,計算資源估算方法:LCU個數=QPS*單次查詢消耗的LCU。其中單次查詢消耗的LCU可以先購買一個入共享通用型應用后,在搜索測試功能中進行測試查看單次查詢消耗的LCU。
4.配置應用:
手動創建應用結構:可以自定義應用結構進行應用創建。
通過模板創建應用結構:系統默認提供了幾種常用的模板樣式,用戶也可以將自己定義的應用結構創建成模板,可以通過已有模板快速創建出一個新的應用。
上傳文檔生成應用結構:您可以上傳已有的數據文件(僅支持JSON格式),系統會自動解析并創建出初始的應用結構(注意字段類型等需要重新定義)
通過數據源創建應用結構:適用于通過RDS、MaxCompute(原ODPS)、PolarDB等數據源同步的場景,可以快速由源表結構創建出初始的應用結構,節省手動構造的工作量,降低出錯概率。這里以RDS為例,其他數據源操作類似,具體詳見數據源配置。
使用阿里云開放存儲服務ODPS、RDS、PolarDB可以在OpenSearch控制臺直接配置使用相應的數據源,數據將自動同步進入OpenSearch,簡單、方便、可靠。本文將以RDS為例,選擇通過數據源創建應用結構。
5.連接數據源
填寫數據庫配置,具體參見下圖:
6.選擇數據源:
7.定義應用結構
我們采用商品表為主表,商品價格表為輔表的方式創建了應用結構即商品價格表主鍵pid關聯商品表外鍵id。 原型所用的結構如下圖:8.定義索引結構
將商品表、商品價格表中需要搜索的相關字段添加到索引列表“default”中,這樣就能通過query=default:“關鍵字”
,對商品進行搜索操作了。具體配置見下圖:
注意:分詞方式直接影響搜索結果,請謹慎選擇,關于分詞方式的選擇具體請參考文檔。
9.配置數據源
在這里,您可以選擇是否開啟數據自動同步功能。 開啟后,數據更新將自動同步至OpenSearch。
10.配置完成后,單擊“完成”,此時在應用詳情頁中就可以看到,應用的狀態處于“應用初始化中.”:
上傳數據
上面我們是以RDS為例,索引構建中會默認開始導入全量數據,可以在應用詳情頁中看到具體進度。當然也可以調用OpenSearch API或者SDK來手動上傳數據:
測試
數據上傳成功后就開始搜索體驗了,OpenSearch控制臺內置了OpenSearch搜索可以通過API/SDK或者搜索測試頁面進行查詢(詳見API及SDK說明),本文以系統中搜索測試頁面為例,搜索語法請參考API開發者手冊搜索接口及query子句介紹。搜索結果如下圖所示:
您還可以利用OpenSearch各種自定義的功能,來獲得更優的搜索體驗。例如解決目前用戶長尾query召回少、搜索詞填寫錯誤無法召回、輸入拼音無法召回等問題,具體請參考查詢分析和相關性實戰。
配置一個查詢分析:這里我們以拼寫糾錯為例配置一個查詢分析:
第一步:創建查詢分析干預詞典: 1.1 依次單擊控制臺主頁功能 搜索算法中心--召回配置--詞典管理
進入查詢分析干預詞典頁面:
1.2 單擊右上角“創建”,詞典類型為拼寫糾錯,輸入詞典名稱單擊“保存”:1.3 在詞典列表中剛剛創建的詞典后單擊詞條管理進入干預詞典頁面:1.4 單擊新增干預詞條配置您的干預詞條:1.5 單擊保存,添加成功。您可以在干預詞條列表中看到您創建的干預詞條:第二步:開放搜索控制臺左側導航欄中依次單擊召回配置→查詢分析配置進入查詢分析頁面:第三步:單擊創建添加一個未上線規則,干預詞典選擇我們剛剛創建的dic_error:
停用詞:根據系統內置的停用詞典過濾查詢中無意義的詞(一般是使用頻度過高的但不影響查詢結果的詞,比如標點符號、語氣助詞等)。例如:查詢詞“奔跑吧!兄弟”,經過停用詞處理后標點符號“!”不參與召回。
拼寫糾錯 :檢查用戶查詢串中的拼寫錯誤,并給出糾錯建議。對于確定的拼寫錯誤將直接改寫原始查詢串,然后進行檢索;對于可能的拼寫錯誤將仍然使用原始查詢串進行檢索。例如:查詢詞“阿里爸爸”,經過拼寫糾錯會改寫為“阿里巴巴”,然后進行檢索。
詞權重 :分析查詢中每個詞的重要程度,并將其量化成權重,權重較低的詞可能不會參與召回。例如:查詢詞“開放搜索好不好”,經過詞權重處理,只要包含“開放搜索”的文檔都可以召回。
同義詞:根據系統提供的通用同義詞庫和語義模型,對查詢串進行同義詞擴展,以便擴大召回。例如:查詢原詞為”KFC”,經過同義詞處理后,包含”肯德基”或者”KFC”的文檔都會被召回(配合詞權重功能使用效果更佳)。
實體識別:命名實體識別(Named Entity Recognition,簡稱NER)是系統對Query分詞后將每個語義實體進行需求識別的功能。每個語義實體會被打上相應的類型標簽,類型標簽重要性低的語義實體在查詢中可能會被省略;類型標簽重要性高的語義實體會直接影響類目預測模型的訓練。比如“耐克修身連衣裙”,實體識別的結果為“耐克/品牌/中”“修身/款式元素/低”“連衣裙/品類/高”。
第四步:創建之后,可在查詢分析界面,單擊“搜索測試”進行效果驗證:第五步:調試無誤后,可返回查詢分析界面,在切換到“索引視角”后,將其設置為默認查詢分析:
配置排序表達式:排序表達式允許用戶為應用自定義搜索結果排序方式,通過在查詢請求中指定表達式來對結果排序,具體請參考搜索相關性配置。
第一步:依次單擊應用主頁排序配置→策略管理進入搜索結果排序管理頁面:
第二步:單擊右上角的創建,添加新的基礎排序(粗排):
基礎排序(粗排)對性能影響較大,盡量選用最有代表性的字段。這里我們以配置文本分、文檔新舊程度的算分配置為例。
第三步:添加新的業務排序(精排):這里我們以配置商品名相關性為例。
第四步:完成配置。搜索結果如下圖所示:這里搜索測試支持普通查詢和設置策略排序后的查詢結果對比。
配置下拉提示:電商場景中,為了減少用戶輸入,幫助用戶盡快找到想要的內容,我們可以使用開放搜索的下拉提示功能。關于下拉提示功能的配置請參考下拉提示。
配置類目預測:您也可以使用類目預測功能預測用戶想要查詢那個類目的結果,具體步驟請參考類目預測。
其他常用配置:
電商場景中,如果某個商家的多個商品的文檔分值都比較高,則都排在了搜索結果的前面。這樣既不利于結果展示,也不利于用戶體驗。我們可以采用多樣性聚合distinct子句來提升結果的多樣性。具體用法請參考聚合子句-distinct。
業務上還支持按價格區間進行結果的查看,需要采用filter子句,更多用法請參考過濾子句-filter。我們以價格字段進行過濾為例,操作相關代碼如下:
if(!lowPrice.equals("")){ queryElement.addFilter("price>=" + lowPrice); } if(!highPrice.equals("")){ queryElement.addFilter("price<=" + highPrice); }
總結
至此一個簡單的基于阿里云OpenSearch構建的電商場景下的搜索原型已經構建完成。OpenSearch提供了比較完善的搜索服務和API接口,能夠基于OpenSearch快速實現業務對于搜索的需求,大大減少了開發工作,提高了搜索功能開發的實現效率,同時也減少了搭建復雜搜索引擎平臺帶來的系統部署和運維的工作量和成本。用戶可以根據業務場景的不同選擇OpeanSearch各種自定義配置和功能,從而獲得更優的搜索體驗。