(2)ElasticSearch在linux環境中集成IK分詞器
- 2020 年 11 月 18 日
- 筆記
- elasticsearch
1.簡介
ElasticSearch默認自帶的分詞器,是標準分詞器,對英文分詞比較友好,但是對中文,只能把漢字一個個拆分。而elasticsearch-analysis-ik分詞器能針對中文詞項顆粒度進行粗細提取,所以對中文搜索是比較友好的。IK分詞器有兩種類型ik_smart和ik_max_word,前者提取詞項粒度最粗,後者最細。而ElasticSearch默認並不支援IK分詞器,需要自己安裝。
2.前期準備
2.1下載elasticsearch-analysis-ik分詞器組件
到GitHub下載頁//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 "//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>
其中//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