OpenSearch自定義分詞服務
背景
OpenSearch是一個以雲服務方式提供給廣大開發者使用的搜尋引擎平臺。在搜尋引擎中,分詞是最基礎但很重要的功能,其效果會直接影響文件的召回。分詞歧義會導致引擎無法召回目標文件。例如:
乒乓球拍賣完了 ==> 乒乓球/拍賣/完了
乒乓球拍 ==> 乒乓/球拍
在上面的case中,短語“乒乓球拍”不同的上下文中分詞的結果不一樣。假如文件的內容為“乒乓球拍賣完了”,使用者通過查詢詞“乒乓球拍”是無法召回該文件的。
OpenSearch的使用者來自各行各業,類似上述例子的場景會被不同的使用者遇到。分析線上query時,發現不少使用者由於分詞效果不理想,對同一個欄位用不同的分詞器建了多個索引(如單字分詞,模糊分詞,中文基礎分詞),查詢時同時查多個索引已達到召回文件的目的。這種做法不僅會消耗更多的系統資源,而且通常效果會不太好。
支援使用者對分詞幹預顯得尤為重要。OpenSearch內部是一個多租戶多應用共用的系統,因此,還需要確保應用間的干預是完全隔離的,不會互相影響。
基本思路
要對分詞結果的干預,第一直覺就是使用者可以定製分詞器。有一種做法就是使用者自己提供分詞器,系統整合使用者的分詞器,這種方式對系統或者使用者來說都太重了。系統需要對使用者的分詞器做稽核,不能影響系統的穩定性;同時使用者還需要理解分詞介面等細節。當然,使用者來可以自己分詞,並將分詞結果用於索引構建和查詢,這要求使用者自身有較強的技術,同時自身也會遇到需要干預的地方。
OpenSearch採用另一個方式:
- 系統提供通用中文分詞器,適用於絕大多數的場景;
- 提供面向特定行業領域的分詞器,如視訊分詞器、電商分詞器、人名分詞器等;通過這種方式可以優化一些特定領域的分詞效果,以儘量滿足使用者的需求;
- 開放分詞幹預的介面,讓使用者進一步對分詞結果進行定製化處理。使用者可以在系統提供的基礎分詞器,通過結合自己的干預詞條建立自定義分詞器,並將該分詞器應用在相應的索引欄位中,達到干預索引和查詢時的分詞結果,確保搜尋召回。
針對不同的場景,系統提供了兩種型別的干預詞條:語義實體和語義切分.
- 語義實體:主要用於一些系統尚未識別的實體詞,干預後,該詞的切分總是能保持一致,不受其所在的上下文影響。
- 語義切分:用於指定在特定上下文中,短語的切分方式,而不影響該短語在其他上下文中的切分方式。
系統流程
由使用者自定義分詞幹預的資料,需要系統對使用者的干預進行管理,包括:
- 對使用者:
- 干預資料的推送
- 干預資料的檢視
- 干預資料的使用
- 對系統:
- 干預資料合法性檢查,保證詞條幹預能正常生效
- 干預資料量控制,這主要是對系統的保護;
- 干預資料生效後,才能被使用者進行使用。如果使用者的干預資料沒有完全生效,就被用於索引的構建,會導致部分文件的分詞結果和預期干預的不一樣,出現無法被召回的情況。
使用者詞典資料管理
圖中1至7為使用者詞典資料流,當用戶建立詞典時,系統會該詞典分配一個惟一的id,詞典資料會在ConfigServer內進行合法性檢查,在經過幾個模組和訊息佇列之後,會在BuildService那邊建好索引,索引資料被分詞服務載入起來,在分詞的時候進行使用。
在索引構建時,會將詞典資料構建兩種不同型別的索引:kv索引和倒排索引。
- kv索引是以使用者詞條的原詞做key,干預後的分詞做為value,用於分詞時使用。
- 對詞典id構建倒排索引,達到可以根據id獲得整個詞典的所有內容,方便使用者檢視詞典的詳情。
在圖中5.1時,詞典資料被寫到了DB。這是為了在有些情況下,需要使用者的干預資料進行索引重建,此時可以從資料庫獲得全量的干預資料。
干預生效
這裡包括兩個方面:
- 推送的干預資料生效判斷。由於整個資料流中,詞典資料流轉的地方都是嚴格按序處理的,因此在使用者的詞典資料最後增加一個哨兵doc,通過檢查這個哨兵doc的狀態,來判斷使用者的詞典資料有沒有全量生效;
- 干預資料在索引構建和查詢生效。
- 在對文件進行索引構建時,當用戶使用了干預資料時,會將對應的欄位內容以及分詞器的配置傳給分詞服務,分詞服務返回分詞結果,BuildService根據該結果對文件建索引,供線上searcher載入提供查詢服務;
- 查詢時,Agg收到查詢請求時,會將從ConfigServer獲取到的索引和分詞配置資訊,和使用者的查詢詞相關的資訊一起發給分詞服務,並用分詞服務返回的分詞結果查詢引擎。
- 這樣就保證索引構建和查詢時分詞結果的一致性。
後續工作
- 為了保證查詢和索引構建時的分詞效果一致性,使用者對分詞詞典內容的修改,或者對自定義分詞器的修改,當前的產品邏輯上要求對使用者對索引進行重建。為了效果,犧牲了一定的易用性。後續會提供機制,讓使用者自己選擇是否需要索引重建。同時,支援在查詢支援指定分詞器。
- 上面的流程中,詞典資料的管理流程比較複雜。後續將通過遷移到OpenSearch統一的干預服務中去。
- 分詞器的迭代更新,建立合理有效的分詞器模型、系統和行業詞典內容的更新機制。
最後
OpenSearch的自定義分詞服務中使用的中文分詞器選擇用AliNLP_WS,這裡特別感謝iDST-NLP-自然語言基礎技術團隊的大力支援。
附錄
推薦與搜尋技術釘釘交流群