Easysearch IK 字段級別詞典動態(tài)更新實戰(zhàn)
0、前言
在企業(yè)級搜索項目中,IK 分詞器的字段級別詞典功能讓我們?yōu)椴煌瑯I(yè)務場景配置專屬詞庫。
圖片
然而在實際使用過程中,我們發(fā)現(xiàn)一個痛點:詞典只支持新增,無法對已有詞典進行修改或刪除。
這在業(yè)務快速迭代的環(huán)境下顯得尤為棘手,每次詞典調(diào)整都需要重建索引,運維成本居高不下。
最新的 IK 插件通過 IK reload API 解決了這個問題。
本文將從實際項目經(jīng)驗出發(fā),詳細介紹詞典動態(tài)更新的完整解決方案。
1、詞典更新的現(xiàn)實困境
在生產(chǎn)環(huán)境中,我們遇到的典型場景是這樣的:短視頻平臺需要根據(jù)網(wǎng)絡熱梗動態(tài)調(diào)整分詞策略,電商系統(tǒng)需要實時更新新興品牌詞庫,社交媒體平臺需要快速添加流行語和網(wǎng)絡用語。

傳統(tǒng)的 IK 字段級別詞典在這些場景下暴露出明顯的局限性。
以短視頻內(nèi)容搜索為例,當"多巴胺穿搭"這個流行詞匯需要從單字分詞調(diào)整為整詞分詞時,原有方案只能通過重建索引來實現(xiàn)。這不僅影響服務可用性,還帶來了巨大的資源消耗。更棘手的是,當詞典中出現(xiàn)過時的網(wǎng)絡用語需要刪除時,幾乎無解。
深入分析發(fā)現(xiàn),問題的根源在于 IK 分詞器的詞典加載機制。傳統(tǒng)方式下,詞典在索引創(chuàng)建時一次性加載到內(nèi)存,后續(xù)無法動態(tài)更新。這種設計在靜態(tài)場景下工作良好,但面對動態(tài)業(yè)務需求時就顯得力不從心。
2、IK reload API 的設計思路
IK reload API 采用全量重新加載的策略來解決詞典更新問題。其核心思想是通過 API 觸發(fā)詞典的重新加載過程,從存儲層重新讀取最新的詞典數(shù)據(jù),并更新內(nèi)存中的詞典結(jié)構(gòu)。
這種方案的優(yōu)勢在于保持了詞典數(shù)據(jù)的一致性,避免了增量更新可能帶來的狀態(tài)不一致問題。
同時,API 設計支持全量重載和指定詞典重載兩種模式,為不同場景提供了靈活的選擇。
需要注意的是,reload API 的影響范圍是有限的。它只對后續(xù)的文檔分析生效,已經(jīng)索引的文檔不會受到影響。
這種設計既保證了歷史數(shù)據(jù)的穩(wěn)定性,又滿足了新數(shù)據(jù)的動態(tài)需求。
3、實戰(zhàn)演練:完整的詞典更新流程
3.1 .analysis_ik 索引接收新詞庫
添加新詞庫操作如下:
圖片
圖片
3.2 創(chuàng)建索引驗證
讓我們通過一個完整的示例來演示詞典動態(tài)更新的全過程。 如下的創(chuàng)建報錯,前提需要 3.1 小節(jié)的添加新詞庫的操作。
圖片
添加詞庫后,就可以正確執(zhí)行如下的操作。
PUT my-index-000001
{
"settings": {
"number_of_shards": 3,
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ik_smart",
"custom_dict_enable": true,
"load_default_dicts": false,
"lowcase_enable": true,
"dict_key": "test_dic"
}
}
}
},
"mappings": {
"properties": {
"test_ik": {
"type": "text",
"analyzer": "my_custom_analyzer"
}
}
}
}
圖片
在這個配置中,我們關閉了默認詞庫(load_default_dicts: false),只使用自定義詞典 test_dic。
這樣可以更清晰地觀察詞典更新的效果。
3.3 未添加詞庫前,自定義分詞效果驗證
接下來測試初始詞典的分詞效果。
圖片
GET my-index-000001/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "顯眼包,多巴胺穿搭"
}3.4 添加詞庫后,自定義分詞效果驗證
現(xiàn)在我們需要更新詞典,將"多巴胺穿搭 顯眼包"兩個添加為完整詞條。
圖片
POST .analysis_ik/_doc
{
"dict_key": "test_dic",
"dict_type": "main_dicts",
"dict_content": "多巴胺穿搭 顯眼包"
}自定義詞典的新增會每分鐘自動裝載的,只有刪除或者更新才需要 reload。
重載完成后,再次測試分詞效果:
圖片
POST my-index-000001/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "顯眼包,多巴胺穿搭"
}3.5 指定詞典重載,精細化控制!
在生產(chǎn)環(huán)境中,我們通常會有多個詞典服務于不同的業(yè)務場景。
IK reload API 支持指定詞典的精確重載,避免不必要的全量操作:
POST _ik/_reload
{
"dict_key": "test_dic"
}通過執(zhí)行結(jié)果可以觀察到重載過程:
圖片
對于使用自定義詞典索引的場景,還可以指定詞典索引名稱:
POST _ik/_reload
{
"dict_index": "custom_ik_index"
}這種靈活性讓我們能夠在復雜的多租戶環(huán)境中精確控制詞典更新的影響范圍。
3.6 刪除新詞庫中詞,然后看效果
圖片
圖片
注意要 reload 執(zhí)行詞典重載一下,確保更新完成!!
POST _ik/_reload
{}
圖片
圖片
4、生產(chǎn)實踐中的注意事項
在實際項目應用中,我們總結(jié)了幾個關鍵的注意事項。
首先是詞典更新的時效性問題。reload API 只對后續(xù)寫入的文檔生效,已經(jīng)索引的文檔不會重新分詞。這意味著如果需要對歷史數(shù)據(jù)應用新的分詞規(guī)則,仍然需要考慮重建索引或使用 update_by_query 等方案。
其次是內(nèi)置詞典的限制。由于用戶無法直接修改 IK 內(nèi)置詞典文件,reload API 不會影響內(nèi)置詞典。這個設計保證了系統(tǒng)的穩(wěn)定性,但也要求我們在詞典規(guī)劃時充分考慮內(nèi)置詞典和自定義詞典的配合使用。
在集群環(huán)境下,reload 操作會在所有節(jié)點上執(zhí)行,確保詞典狀態(tài)的一致性。但這也意味著在大規(guī)模集群中,重載操作可能需要一定的時間窗口。建議在業(yè)務低峰期進行詞典更新操作。
5、項目總結(jié)與展望
通過 IK reload API,我們成功解決了字段級別詞典無法動態(tài)更新的問題。這個功能在我們的短視頻內(nèi)容搜索項目中發(fā)揮了重要作用,讓產(chǎn)品運營團隊能夠快速響應網(wǎng)絡熱點,及時收錄"OOTD穿搭"、"city不city"、"emo了"等流行詞匯,提升用戶搜索體驗。
從技術層面看,reload API 的引入讓 Easysearch 的 IK 分詞器更加適應現(xiàn)代應用的動態(tài)需求。雖然仍有一些限制,比如對歷史數(shù)據(jù)的影響范圍,但整體上大幅提升了系統(tǒng)的靈活性和可維護性。






















