天天看點

使用 Elasticsearch 的 NGram 分詞器處理模糊比對

接到一個任務:用 elasticsearch 實作搜尋銀行支行名稱的功能。大概就是使用者輸入一截支行名稱或拼音首字母,傳回相應的支行名稱。比如,使用者輸入"工行"或者"gh",我需要傳回"工行xxx分行"類似這樣的結果。

我心裡嘀咕着:資料庫不是支援通配符查詢嗎?為什麼不直接用資料庫查詢?

說歸說,但是任務還是要完成的。之前有在網上看過一篇文章,主要就是說用 elasticsearch 處理通配符查詢不太适合,然後我在評論中看到作者推薦了一個分詞器 ngram。

這個分詞器可以讓通配符查詢和普通的查詢一樣迅速,因為該分詞器在資料索引階段就把所有工作做完了:

{

"settings": {

},

"mappings": {

}<code>`</code>

當某個字段的 analyzer 被指定為 ngram_analyzer,這個字段的查詢就都會變成通配符查詢,無論是 term 還是 match。

比如,post /index/type

會得到"中國工商銀行xxx分行"、"工行xxx分行"、"中國招商銀行xxx分行"。

match 查詢會對關鍵詞進行分詞,而 lucene 的預設中文分詞就是把每個中文字拆開,這樣會變成對"工"、"商"兩個字做通配符查詢。