📢 本文由 gemini-2.5-flash 翻譯
Elasticsearch 系列
內容 連結 Elasticsearch 基礎操作 https://blog.yexca.net/archives/226 Elasticsearch 查詢操作 https://blog.yexca.net/archives/227 RestClient 基礎操作 https://blog.yexca.net/archives/228 RestClient 查詢操作 https://blog.yexca.net/archives/229 Elasticsearch 資料聚合 https://blog.yexca.net/archives/231 Elasticsearch 自動補齊 本文 Elasticsearch 資料同步 https://blog.yexca.net/archives/234 Elasticsearch 叢集 https://blog.yexca.net/archives/235
當使用者在搜尋框輸入字元時,應該提示與該字元相關的搜尋項目,根據輸入的字母提供完整的詞彙功能,這就是自動補齊。
拼音斷詞
要實現根據字母進行補齊,就必須對文件依照拼音斷詞。
專案位址: https://github.com/medcl/elasticsearch-analysis-pinyin
安裝方式與 IK 斷詞器相同,以下為線上安裝方式,首先進入容器:
| |
執行指令:
| |
然後退出並重啟:
| |
測試:
| |
自訂斷詞器
預設的拼音斷詞器會將每個漢字單獨斷成拼音,而我們希望的是每個詞彙形成一組拼音,因此需要對拼音斷詞器進行客製化設定,以形成自訂斷詞器。
Elasticsearch 中斷詞器 (analyzer) 的組成份為三部分:
- character filters:在詞元分析器 (tokenizer) 之前對文字進行處理。例如刪除字元、替換字元。
- tokenizer:將文字依照一定的規則切割成詞彙 (term)。例如 keyword,就是不斷詞;還有 ik_smart。
- tokenizer filter:將詞元分析器 (tokenizer) 輸出後的詞彙做進一步處理。例如大小寫轉換、同義詞處理、拼音處理等。

宣告自訂斷詞器的語法如下:
| |
測試:
| |
自動補齊查詢
Elasticsearch 提供了 Completion Suggester 查詢來實現自動補齊功能。這個查詢會匹配以使用者輸入內容開頭的詞彙並回傳。為了提高補齊查詢的效率,對於文件中的欄位類型有一些限制:
- 參與補齊查詢的欄位必須是 completion 類型
- 欄位的內容一般是為了補齊而由多個詞彙組成的陣列。
建立測試索引庫:
| |
插入測試資料:
| |
查詢:
| |
自動補齊 Java
上述 DSL 的 Java 請求:
| |
回應處理:
| |
飯店搜尋自動補齊
之前的 hotel 索引庫未設定拼音斷詞器,但索引庫無法修改,因此需要刪除並重建。
| |
修改 HotelDoc 實體類別,新增 suggestion 欄位:
| |
重新匯入資料:
| |
查詢測試:
| |
可以看到查詢結果的 suggestion 欄位,接著編寫業務程式碼。
Controller:
| |
Service:
| |