(2)ElasticSearch在linux環境中集成IK分詞器

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