ELK技術-IK-中文分詞器

2022-09-01 12:04:25

1.背景

1.1 簡介

ES預設的分詞器對中文分詞並不友好,所以一般會安裝中文分詞外掛,以便能更好的支援中文分詞檢索。

1.2 IK分詞器

IK分詞器在是一款基於詞典和規則的中文分詞器。這裡講解的IK分詞器是獨立於Elasticsearch、Lucene、Solr,可以直接用在java程式碼中的部分。實際工作中IK分詞器一般都是整合到Solr和Elasticsearch搜尋引擎裡面使用。
IK分詞采用Java編寫。
IK分詞的效果主要取決於詞庫,目前自帶主詞典擁有27萬左右的漢語單詞量。對於應用領域的不同,需要各類專業詞庫的支援。詞庫還可以自己維護。
IK分詞器地址:https://github.com/medcl/elasticsearch-analysis-ik
IK分詞器有兩種分詞模式:ik_max_word和ik_smart。

下載安裝包

  1. 下載預編譯的安裝包,下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
  1. 下載對應版本,IK版本與Elasticsearch版本一致
  1. 將IK包加入到Elasticsearch外掛目錄下,新建ik目錄,參考如下:

1.3 分詞模式

IK分詞器有兩種分詞模式:
  1. 細粒度模式 ik_max_word
  1. 智慧模式 ik_smart

細粒度模式

採用細粒度模式ik_max_word:會將文字做最細粒度的拆分,比如會將「中華人民共和國國歌」拆分為「中華人民共和國,中華人民,中華,華人,華,人民共和國,人民,人,民,共和國,共和,和,國國,國歌」,會窮盡各種可能的組合。測試程式碼:
 GET /_analyze
{
  "text": ["中華人民共和國國歌"],
  "analyzer": "ik_max_word"
}

分詞規則

  1. 當查詢詞在詞典中不存在時,會按字拆分。如:在風->在,風
  1. 當查詢詞在詞典中存在,且長度為兩個字時,有時拆分有時不拆分。例如:甲乙–>甲乙 , 聯通–>聯通,聯,通
  1. 當查詢詞在詞典中存在,且查詢詞的一部分也在詞典在中存在,則分別拆分。例如:甲乙丙丁–>甲乙丙丁,甲乙,丙丁 中國聯通–>中國聯通,中國,國聯,聯通,通
  1. 當查詢詞任意部分都不在詞典中儲存,則按字拆分

智慧模式

智慧模式ik_smart會做最粗粒度的拆分。比如會將「中華人民共和國國歌」拆分為「中華人民共和國,國歌」,適合 Phrase 查詢。
 GET /_analyze
{
  "text": ["中華人民共和國國歌"],
  "analyzer": "ik_smart"
}

分詞規則

  1. 當查詢詞在詞典中不存在時,會按字拆分 例如:在北–>在,北
  1. 當查詢詞在詞典中存在,不做拆分 例如:甲乙–>甲乙,甲乙丙丁–>甲乙丙丁
  1. 當查詢詞任意部分都不在詞典中儲存,則按字拆分

2.分詞實踐

2.1 詞典設定

很多時候預設的分詞效果達不到線上使用的要求,這就需要不斷維護擴充套件詞典和停止詞字典,提高分詞匹配的準確性,優化使用者體驗。
在IK分詞器中,主要可以維護2種詞典,一種是擴充套件詞典,可以自定義一些詞語,提高分詞精讀。
另一種是停止詞詞典,停止詞就是指不會被分詞拆分出來的詞語,不參與分詞和檢索操作。
可以通過修改IKAnalyzer.cfg.xml組態檔,來自定義詞典。IKAnalyzer.cfg.xml的位置為{plugins}/ik/config/。

注意事項

  1. ext_dict:直接修改ext_dict屬性中設定的欄位裡面的內容,並不能立刻生效。只有重啟ES程序範例,修改的內容才會生效。
  1. remote_ext_dict:通過遠端擴充套件的字典,可以實現詞典的熱更新,不用重啟ES程序範例。

2.2 詞典熱更新

設定詞典代理

設定詞典源有多種模式,如tomact容器,Nginx代理等,本例基於Nginx設定代理如下:
Nginx按照參考:《Nginx按照教學》
 server {
        listen       8084;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }       
        location /ik-remote-dic {
            alias   /opt/elasticsearch/ik-config;
            autoindex on;
            }
........

設定詞典值

在目錄下設定資料詞典(本例為: /opt/elasticsearch/ik-config),由於是中文分詞,特別注意檔案的字元格式(UTF-8),參考如下:

設定遠端詞典源

2.3 分詞應用

關鍵詞查詢,未做擴充套件的資料字典:
 GET /_analyze
 {
   "text": "成都數康公司,通商速子股份有限公司,位元組不跳動公司,頭顱後側位工時,王令",
   "analyzer": "ik_smart"
 }
關鍵詞查詢,做擴充套件的資料字典:
 GET /_analyze
 {
   "text": "重慶數康公司,通商數位股份有限公司,位元組跳動公司,頭顱正側位工時,王令,王玲的報告,測試是報告",
   "analyzer": "ik_smart"
 }