1. 程式人生 > 其它 >elasticsearch-ik分詞器遠端停用詞彙"失效"問題

elasticsearch-ik分詞器遠端停用詞彙"失效"問題

這其實是和自己沒看 IK 原始碼有關。IK的原理是先分詞,再檢視是否有禁用詞彙。

以下是 IK 讀取到的遠端分詞配置和停用詞配置

具體情況如下:

我當時認為配置了停用詞彙後,出現“停用詞彙”、“每小時加收”、“123456”這類的分詞,是會將對應的詞彙刪除後,再去es庫查詢對應的關鍵字,以提高準確度

但是,使用Kibana 傳送分詞指令後,

POST _analyze
{
  "analyzer" : "ik_smart",
  "text": "舉例舒停用詞彙"
}

發現“停用詞彙”四個字並未被停用

{
"tokens" : [
{
"token" : "舉例",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "舒",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
}
]
}

使用“每小時加收”詞彙後,卻是能正確分詞。

# 分詞查詢
POST /kinth_ocr_new/_analyze
{
  "analyzer" : "ik_smart",
  "text": "舉例舒每小時加收"
}

{“”
"tokens" : [
  {
    "token" : "舉例",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "CN_WORD",
    "position" : 0
  },
  {
    "token" : "舒",
    "start_offset" : 2,
    "end_offset" : 3,
    "type" : "CN_CHAR",
    "position" : 1
  }
 ]
}

原因很簡單,就是一開始說的,因為IK分詞器是先分詞,再檢視是否用禁用詞彙。“每小時加收”是詞典中有的,IK 分詞後,會將“每小時加收”作為一個詞,後面也就能匹到禁用詞典。

而“停用詞彙”並沒有在詞典中配置,所以 IK 先分詞為“停用”、“詞彙”,後續停用詞典也就無法匹配“停用詞彙”這四個字