1. 程式人生 > >(2)ElasticSearch在linux環境中整合IK分詞器

(2)ElasticSearch在linux環境中整合IK分詞器

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-analysi