閱讀642 返回首頁    go 汽車大全


相關性實戰__功能篇_最佳實踐_開放搜索-阿裏雲

針對目前若幹用戶遇到的搜索結果與預期不符合的問題進行統一詳細說明,並以此為話題展開說明下opensearch在搜索效果方麵的功能和後續一些工作方向。

首先,對於搜索來講,最常見的有兩種做法:

  1. 數據庫的like查詢,可以理解為簡單的包含關係;
  2. 百度、google等搜索引擎,涉及到分詞,將查詢詞根據語義切分成若幹詞組term(這個是搜索引擎重難點之一),通過term組合匹配給相應文檔進行打分,根據分值排序,並最終返回給用戶。

opensearch采用的方式與上述搜索引擎做法基本一致。那這裏就有三部分內容會影響搜索效果:1,分詞方式;2,匹配方式;3,相關性算分。

我們來分別說下這三部分在opensearch上的行為和表現。

分詞方式

原理

分詞會在兩個地方使用:

  1. 索引構建時:接收到用戶推送文檔後,會根據用戶定義的應用結構,取出其中為TEXT、SWS_TEXT字段進行分詞,將對應文檔內容分成若幹term(如"浙江大學"拆分成2個term:"浙江"和"大學"),並針對每個索引字段配置(可搜索的索引字段)構建term到文檔doc的倒排鏈表,用於快速召回使用;
  2. 查詢時:將查詢詞進行分詞,按照切完後的term查找倒排鏈,從而找到(召回)包含該term的文檔。 由此可見,這兩部分的分詞方式必須一致,否則會出現對應文檔無法召回的情況。

接下來,我們詳細說明下各個字段的展現效果及適用場景,供大家參考。

STRING

不分詞,適合一些需要精確匹配或者隻展示不搜索的場景,如標簽、關鍵詞、url等。

如文檔字段內容為“菊花茶”,則隻有搜索“菊花茶”的情況下可以召回。

TEXT、MWS_TEXT

按照檢索單元做分詞,適合有語義的中文搜索場景,如標題、文本等,MWS_TEXT是TEXT的擴展,會召回更多的內容,建議使用MWS_TEXT。

如文檔字段內容為“菊花茶”,則搜索“菊花茶”、“菊花”、“茶”、“花茶”的情況下可以召回。

SWS_TEXT

按照單字/單詞分詞,適合非語義的中文搜索場景,如小說作者名稱、店鋪名等;

如文檔字段內容為“菊花茶”,則搜索“菊花茶”、“菊花”、“茶”、“花茶”、“菊”、“花”、“菊茶”的情況下可以召回。

SHORT_TEXT

短文本模煳搜索,支持拚音搜索、數字的前後綴搜索、單字或者單字母搜索。最多支持100個字節字段長度,更多介紹及注意事項參見模煳搜索使用說明

如文檔字段內容為“菊花茶”,則搜索“菊花茶”、“菊花”、“茶”、“花茶”、“菊”、“花”、“菊茶”、“ju”、“juhua”、“juhuacha”、“j”、“jh”、“jhc”等情況下可以召回。
如文檔字段內容為手機號“13812345678”,則通過“^138”來搜索以“138”開頭的手機號,通過“5678$”搜索以“5678”結尾的手機號;
如文檔字段內容為“OpenSearch”,則通過單個字母或者組合都可以檢索到。

ENG_TEXT

英文分詞,適合於英文搜索場景,對於分詞後的每個英文單詞默認會做去詞根、單複數轉化。

如文檔字段內容為“英文分詞器 english analyzer”,則搜索“英文分詞器”、“english”、“analyz”、“analyzer”、“analyzers”、“analyze”、“analyzed”、“analyzing”。
(注意:英文分詞器中連續的中文會被分成一個詞)

NWS_TEXT

自定義分詞,適合特殊場景下係統自帶無法解決的搜索場景,可以實現完全用戶控製的效果。推送文檔及搜索時使用製表符“t”對字段內容(或查詢詞)進行分隔,注意二者分詞的一致性,否則會導致無法召回文檔的情況。

如字段內容為“菊t花茶thao”,則隻有查詢詞“菊”、“花茶”、“菊t花茶”、“花茶thao”、“菊thao”、“菊t花茶thao”可以召回該文檔。

後續工作

  1. 增加對小語種的支持,如俄語、葡語、日語等。

使用技巧

1,在一些召回不好的情況下,可以采用TEXT和SWS_TEXT字段結合的方式來保證搜索效果的同時提高召回率。具體做法為定義兩個相同內容的字段分別為title(TEXT)及sws_title(SWS_TEXT),並分別建立索引字段為title_search、sws_title_search。則查詢詞為query=title_search:'keyword' OR sws_title_search:'keyword',並設置精排表達式為text_relevance(title)*10+field_proximity(sws_title),在保證相關性的同時保證召回。

匹配方式

原理

分完詞後得到若幹term,如何召回文檔,就涉及到匹配方式。目前opensearch內部默認支持的是AND,即一篇文檔中包含全部的term才能被搜索出來。當然這是對同一關鍵詞而言的,除此之外係統還支持多種匹配方式,如AND、OR、RANK、NOTAND以及(),優先級從高到低為(),ANDNOT,AND,OR,RANK。

舉例

關係 用法 含義
query=title:”蘋果 手機” 查詢title中包含蘋果和手機的文檔
AND query=title:’蘋果’ AND cate:’手機’ 交集。查詢title中包含蘋果,且cate包含手機的文檔
OR query=title:’蘋果’ OR cate:’手機’ 並集。查詢title中包含蘋果,或cate包含手機的文檔
RANK query=title:’蘋果’ RANK cate:’手機’ 查詢title中包含蘋果的文檔,如果cate包含手機則可以加分
ANDNOT query=title:’蘋果’ ANDNOT cate:’手機’ 查詢title中包含蘋果,但cate不包含手機的文檔

案例

  1. 問:我文檔中包含“吃飯了”,我搜索“吃飯”、“吃飯了”都能召回,搜索“吃飯了嗎”沒結果? 答:因為目前opensearch是要求全部的分詞結果都匹配才能召回文檔,上麵的“嗎”在文檔中沒有出現,所以無法召回。
  2. 問:我隻想查找某些詞排在最前麵的文檔,比如以“肯德基”開頭的文檔; 答:目前不支持位置相關召回。

後續工作

  1. 我們正在開發query分析的功能,會對不重要的詞做rank,如案例1中的”吃飯了嗎”會改寫成”吃飯” AND ”了” RANK ”嗎”,召回“吃飯了”的文檔,並將“吃飯了嗎”的文檔排在前麵。
  2. 支持用戶詞典,比如糾錯、同義詞等,可以根據自己的實際場景挖掘出屬於自己的專屬詞典。
  3. O2O實體詞識別,如query=title:’杭州市文一西路’改寫為query=title:’杭州市文一西路’ OR (city:’310010’AND district:’0012’ AND title:’文一西路’)。
  4. 支持下拉提示、相關搜索功能。
  5. 熱詞統計、點擊反饋等。

使用技巧

  1. 可以通過AND,OR等實現強大的搜索功能。
  2. 對於一些filter中的過濾字段,如= 、!=的需求,可以盡量使用索引字段來做,可以提高查詢性能。點擊獲取更多優化小技巧

相關性算分

上麵提到的都是跟召回相關的技術,召回文檔之後,究竟文檔如何排序就涉及到相關性。 目前opensearch有sort子句來支持用戶自定義排序。如果不設置sort,則默認為sort=-RANK;sort本身支持多維排序,以及升降序的支持。比如sort=-RANK;+bonus,意思為第一位按照相關性降序排序,相關性分值一樣的文檔再按照bonus升序排列。 這裏我們重點描述下RANK的用法,RANK即為opensearch中的相關性設置,主要分為兩部分:粗排和精排,分別有對應的控製台中的粗精排表達式配置

原理

Opensearch相關性算分策略為,取召回的rank_size(目前是100萬)個文檔按照粗排表達式的定義進行算分;取粗排分最高的N個結果(百級別)按照精排表達式進行算分,並排序;然後根據start與hit的設置取相應結果返回給用戶。如果用戶獲取的結果超過了精排結果數N,則後續按照粗排分數排序結果繼續展現。

  1. 粗排表達式:從上麵原理介紹中可以看出粗排對性能(latency)的影響非常大,但同時粗排又非常的重要,否則會出現好的文檔無法進入精排而導致文檔不能被最終展現。所以粗排要盡量的簡單有效,目前opensearch的粗排隻支持幾個簡單的正排字段、靜態bm25、時效分等因素。
  2. 精排表達式:通過粗排表達式篩選出較優質的N個文檔進行詳細排序,精排表達式中支持複雜的數學計算、邏輯等,並且opensearch提供了豐富的典型場景(如O2O類)的function和feature來滿足日常的相關性需求。

同時,係統以內置了多個場景的應用結構和排序表達式,可以供大家參考和使用。

舉例

場景 表達式 含義
論壇-排 static_bm25() 簡略文本分
論壇-精排 text_relevance(title)*3+text_relevance(body)
+if(text_relevance(title)>0.07,timeliness(create_timestamp),timeliness(create_timestamp)*0.5)
+(topped+special+atan(hits)*0.5+atan(replies))*0.1
文本分
時效分
其他屬性分
O2O-粗排 sold_score+general_score*2 銷量、門店綜合分值(離線算好)
O2O-精排 2*sold_score+0.5*reward
- 10*distance(lon,lat,u_posx,u_posy)
+ if ((flags&2) ==2, 2, 0)+if(is_open==5,10,0)
+ special_score
銷量、配送速度及準點率
距離
是否繁忙、是否在營業時間
人工幹預
小說-粗排 static_bm25()*0.7+hh_hot*0.00003 文本分、熱度
小說-精排 pow(min(0.5,max(text_relevance(category),max(text_relevance(title), text_relevance(author)))),2)
+ general_score*2
+ 1.5*(1/(1+pow(2.718281,-((log10(hh_hot)-2)*2-5)))))
分類相關性、標題相關性、作者相關性
小說質量
小說熱度
電商-粗排 static_bm25()+general_score*2+timeliness(end_time) 文本分、寶貝綜合分值、過期時間
電商-精排 text_relevance(title)*3+text_relevance(category)
+ general_score*2+boughtScore*2
+ tag_match(ctr_query_value,doc_value,mul,sum,false,true)+..
文本相關性、類目相關性
寶貝人氣、賣家分
ctr預估、特征規則分等

案例

  1. 問:精排表達式text_relevance(seller_id)報找不到字段 答:text_relevance()隻支持TEXT及SWS_TEXT類型,其他不可以。

  2. 問:查詢報2112錯誤,是什麼問題? 答:查詢語句(query子句)必須與formula相配合,比如query=default:'keyword',default中包含title和body字段,而formula指定text_relevance(title)+text_relevance(author)則會報錯,因為author在default中不存在。

後續工作

  1. 優化錯誤碼,目前很多查詢錯誤都會報1000錯誤,不利於用戶定位問題,且容易造成係統有問題的誤導,後續會統一進行梳理。
  2. 後續會對電商類場景提供更多樣的feature來支持,如有類似的需要請聯係我們。
  3. 發布截斷功能,允許用戶指定重要字段,構建索引時考慮該字段的值,降低參與粗排文檔數、提高參與精排文檔數,即降低查詢開銷又提高搜索質量,讓更多好的文檔能夠排上來。
  4. 相關性ABTest調試界麵,會在搜索測試頁麵增加多個排序表達式的對比界麵,將每項表達式的值列出來,方便用戶進行排序表達式的調整。

使用技巧

  1. 排序表達式的算分是在查詢結算對每個文檔進行計算的,所以如果跟查詢無關的部分的計算可以預先離線計算好,新增一個general_score字段來存放,排序的時候隻要使用general_score字段即可,避免大量計算過程,提高查詢性能。
  2. tag_match的feature允許用戶將query中的特征與doc中特征做多維運算,在電商場景下有著非常廣泛的用途,有類似的需求的用戶可以研究下。
  3. opensearch提供了豐富的function和feature,使用得當可以獲得非常強大的功能。
  4. 相關性有很多部分共同組成,各項之間的權重需要根據搜索排序效果不斷進行調整以達到一個用戶滿意的搜索效果。

最後更新:2016-11-23 17:16:06

  上一篇:go 相關下載__JavaSDK手冊_SDK參考手冊_開放搜索-阿裏雲
  下一篇:go Array數組類型說明__功能篇_最佳實踐_開放搜索-阿裏雲