1.簡介
ElasticSearch默認自帶的分詞器,是標準分詞器,對英文分詞比較友好,但是對中文,只能把漢字一個個拆分,而elasticsearch-analysis-ik分詞器能針對中文詞項顆粒度進行粗細提取,所以對中文搜索是比較友好的,IK分詞器有兩種型別ik_smart和ik_max_word,前者提取詞項粒度最粗,后者最細,而ElasticSearch默認并不支持IK分詞器,需要自己安裝,
2.前期準備
2.1下載elasticsearch-analysis-ik分詞器組件
到GitHub下載頁https://github.com/medcl/elasticsearch-analysis-ik/releases
下載elasticsearch-analysis-ik-7.8.0版本(因為我的elasticsearch版本是7.8,所以這里IK分詞器組件對應下載版本也是7.8),如圖所示:
3.ik分詞器部署
3.1創建ik分詞器檔案夾
在elasticsearch/elasticsearch-7.8.0/plugins目錄下創建ik分詞器檔案夾(檔案夾名稱一定要命名為ik,不然啟動elasticsearch時候會報錯的),創建檔案夾命令如下:
mkdir /home/deng/elasticsearch/elasticsearch-7.8.0/plugins/ik
再通過Xftp把之前下載好的elasticsearch-analysis-ik-7.8.0.tar.gz安裝包傳輸到installpackage中:

3.2解壓ik分詞器安裝包
先切換到ik檔案夾目錄:
cd /home/deng/elasticsearch/elasticsearch-7.8.0/plugins/ik
把elasticsearch-analysis-ik安裝包解壓到ik目錄當中,本人這里演示是先在本地先解壓elasticsearch-analysis-ik-7.8.0.zip安裝包,然后再通過Xftp復制檔案傳輸到服務端的ik檔案夾中,當然大伙也可以直接使用命令解壓,這里就不詳說了,解壓后如圖所示:
解壓完ik分詞器安裝包后,重啟elasticsearch,
4.測驗ik分詞
4.1ElasticSearch標準分詞
在測驗ik分詞之前,我們通過kibana的dev_tools工具來看看elasticsearch自帶標準分詞器效果:
POST _analyze { "text": ["LM358"] }

POST _analyze { "text": ["LM358,LM"] }

POST _analyze { "text": ["LM358 LM"] }

POST _analyze { "text": ["我是中國人!"] }

通過上面效果圖,我們知道ElasticSearch標準分詞器只會把大部分符號跟空格符作為分詞標準從而拆分詞項,而對中文則是將每個詞作為標準拆分,所以ElasticSearch標準分詞并不能滿足常見中文搜索業務,而這時候ik分詞器就能發揮它的作用了,下面我們再來看看IK分詞效果就會明白了,
4.2ik分詞
在簡介里面介紹過ik分詞器有兩種分詞型別ik_smart和ik_max_word,前者提取詞項粒度最粗,后者最細,下面我們同樣通過kibana的dev_tools工具來看看ik分詞器效果:
POST _analyze { "analyzer":"ik_smart", "text": ["我是中國人!"] }

POST _analyze { "analyzer":"ik_max_word", "text": ["我是中國人!"] }

通過上面效果圖,我們大概會了解到ik分詞器不會跟ElasticSearch標準分詞器一樣只會把每個漢字拆分為單獨一個詞項,而是會根據分詞型別(ik_smart,ik_max_word)把漢字拆分為不同詞項,而且ik_smart拆分顆粒度比較粗糙,ik_max_word拆分顆粒度比較細致,
5.ik分詞擴展詞典
通過官方檔案,我們知道ik分詞器還支持擴展詞典,我們先在elasticsearch/elasticsearch-7.8.0/plugins/ik/config目錄下新建一個custom檔案夾,在custom檔案夾中再新建一個UTF-8編碼的.txt檔案,命名為mydic.dic(具體操作命令我就不詳說了)內容如下圖所示:
然后在elasticsearch/elasticsearch-7.8.0/plugins/ik/config目錄下IKAnalyzer.cfg.xml 組態檔中修改如下配置(只修改ext_dict即可):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment> <!--用戶可以在這里配置自己的擴展字典 --> <entry key="ext_dict">custom/mydict.dic</entry> <!--用戶可以在這里配置自己的擴展停止詞字典--> <entry key="ext_stopwords"></entry> <!--用戶可以在這里配置遠程擴展字典 --> <!--<entry key="remote_ext_dict">location</entry> --> <!--用戶可以在這里配置遠程擴展停止詞字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
然后重啟elasticsearch,再通過kibana的dev_tools工具來看看ik分詞器擴展效果:
POST _analyze { "analyzer":"ik_max_word", "text": ["我是中國人!"] }

6.ik熱詞更新
根據官方介紹,目前IK分詞器是支持熱詞更新的,可以將需自動更新的熱詞放在一個UTF-8編碼的.txt檔案里,放在nginx或其他簡易http server下,當.txt檔案修改時,http server會在客戶端請求該檔案時自動回傳相應的Last-Modified和ETag(該http請求需要回傳兩個頭部header標識,一個是Last-Modified,一個是ETag,這兩者都是字串型別,只要有一個發生變化,IK分詞器就會去抓取新的分詞進而更新詞庫),可以另外做一個工具來從業務系統提取相關詞匯,并更新這個熱詞.txt檔案,
下面演示我使用iis作為http server服務器,新建一個名稱叫hotword站點,站點下有一個hotword.txt檔案,應用池托管為v 4.0集成模式,
同時配置下如下兩個選項:


hotword.txt內容如下:
這里要注意一點細節,因為http請求回傳的內容格式是一行一個分詞,所以hotword.txt詞項要用換行符用 \n換行,
然后再通過在elasticsearch/elasticsearch-7.8.0/plugins/ik/config目錄下IKAnalyzer.cfg.xml 組態檔中修改如下配置:
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<entry key="remote_ext_stopwords">http://192.168.18.4:8082/hotword.txt</entry>
其中http://192.168.18.4:8082/hotword.txt是如上我本地部署熱詞站點,然后重啟elasticsearch,在/elasticsearch/elasticsearch-7.8.0/logs/elasticsearch.log中可以看到加載的熱詞串列,如下所示:
通過kibana的dev_tools工具來看看ik分詞器效果:
POST _analyze { "analyzer":"ik_max_word", "text": ["我是中國人!"] }

參考文獻:
elasticsearch-analysis-ik
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/223874.html
標籤:其他
上一篇:Linux系統安全入門之Firewalld(一、與iptables比較)
下一篇:切換Root用戶和系統更新
