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。
下載安裝包
- 下載預編譯的安裝包,下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
- 下載對應版本,IK版本與Elasticsearch版本一致
- 將IK包加入到Elasticsearch外掛目錄下,新建ik目錄,參考如下:
1.3 分詞模式
IK分詞器有兩種分詞模式:
- 細粒度模式 ik_max_word
- 智慧模式 ik_smart
細粒度模式
採用細粒度模式ik_max_word:會將文字做最細粒度的拆分,比如會將「中華人民共和國國歌」拆分為「中華人民共和國,中華人民,中華,華人,華,人民共和國,人民,人,民,共和國,共和,和,國國,國歌」,會窮盡各種可能的組合。測試程式碼:
GET /_analyze
{
"text": ["中華人民共和國國歌"],
"analyzer": "ik_max_word"
}
分詞規則
- 當查詢詞在詞典中不存在時,會按字拆分。如:在風->在,風
- 當查詢詞在詞典中存在,且長度為兩個字時,有時拆分有時不拆分。例如:甲乙–>甲乙 , 聯通–>聯通,聯,通
- 當查詢詞在詞典中存在,且查詢詞的一部分也在詞典在中存在,則分別拆分。例如:甲乙丙丁–>甲乙丙丁,甲乙,丙丁 中國聯通–>中國聯通,中國,國聯,聯通,通
- 當查詢詞任意部分都不在詞典中儲存,則按字拆分
智慧模式
智慧模式ik_smart會做最粗粒度的拆分。比如會將「中華人民共和國國歌」拆分為「中華人民共和國,國歌」,適合 Phrase 查詢。
GET /_analyze
{
"text": ["中華人民共和國國歌"],
"analyzer": "ik_smart"
}
分詞規則
- 當查詢詞在詞典中不存在時,會按字拆分 例如:在北–>在,北
- 當查詢詞在詞典中存在,不做拆分 例如:甲乙–>甲乙,甲乙丙丁–>甲乙丙丁
- 當查詢詞任意部分都不在詞典中儲存,則按字拆分
2.分詞實踐
2.1 詞典設定
很多時候預設的分詞效果達不到線上使用的要求,這就需要不斷維護擴充套件詞典和停止詞字典,提高分詞匹配的準確性,優化使用者體驗。
在IK分詞器中,主要可以維護2種詞典,一種是擴充套件詞典,可以自定義一些詞語,提高分詞精讀。
另一種是停止詞詞典,停止詞就是指不會被分詞拆分出來的詞語,不參與分詞和檢索操作。
可以通過修改IKAnalyzer.cfg.xml組態檔,來自定義詞典。IKAnalyzer.cfg.xml的位置為{plugins}/ik/config/。
注意事項
- ext_dict:直接修改ext_dict屬性中設定的欄位裡面的內容,並不能立刻生效。只有重啟ES程序範例,修改的內容才會生效。
- remote_ext_dict:通過遠端擴充套件的字典,可以實現詞典的熱更新,不用重啟ES程序範例。
2.2 詞典熱更新
設定詞典代理
設定詞典源有多種模式,如tomact容器,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"
}