在使用 Coreseek(基於 Sphinx 的中文分詞擴展)建立全文搜尋索引時,開發者常遇到一個困擾:搜尋完整英文單字(如 "andy")正常,但輸入前綴字母(如 "a")卻無法匹配任何結果。
Coreseek 預設的索引策略針對中文分詞優化,英文單字預設僅支援整詞匹配。若需實現「輸入首字母即可搜尋」的自動完成功能,必須啟用中綴索引功能。
在 sphinx.conf(或 mysql.conf)的 index 區塊中加入:
index mysql_index
{
source = mysql_src
path = /var/data/mysql_index
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
min_infix_len = 1
html_strip = 0
charset_type = utf-8
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
}
關鍵參數說明:
min_infix_len = 1:啟用中綴索引,最小長度設為 1,表示單個字元也會被索引min_word_len = 1:允許單字元詞彙(需搭配使用)配置修改後必須重新建立索引才能生效:
/usr/local/coreseek/bin/indexer -c /etc/coreseek/mysql.conf mysql --rotate
注意:請根據實際安裝路徑調整 indexer 執行檔與配置檔路徑。--rotate 參數可在不停止 searchd 服務的情況下熱更新索引。
重建完成後,測試搜尋 "a"、"an"、"and" 等前綴,應能正確匹配包含 "andy" 的文檔。
min_infix_len 會顯著增加索引體積(約 1.5~3 倍)與建立時間prefix_fields 或 infix_fields 限定僅對特定欄位(如標題、標籤)啟用前綴索引Coreseek 使用 mmseg 分詞器處理中文,英文預設以空白分隔。若需中英混合自動完成,建議:
charset_table 包含英文字母大小寫轉換規則infix_fields = title,tags