1. 程式人生 > >和我一起打造個簡單搜索之IK分詞以及拼音分詞

和我一起打造個簡單搜索之IK分詞以及拼音分詞

生產環境 ast ken ade usr block analyzer osi 繼續

elasticsearch 官方默認的分詞插件,對中文分詞效果不理想,它是把中文詞語分成了一個一個的漢字。所以我們引入 es 插件 es-ik。同時為了提升用戶體驗,引入 es-pinyin 插件。本文介紹這兩個 es 插件的安裝。

環境

本文以及後續 es 系列文章都基於 5.5.3 這個版本的 elasticsearch ,這個版本比較穩定,可以用於生產環境。

ik 分詞器 和 pinyin 分詞器在 github 倉庫可以找到,註意版本與 elasticsearch 的版本需要對應,本文使用 5.5.3 版本

  • ik 分詞器下載
  • pinyin 分詞器下載

如果 elasticsearch 與我的版本不同,可以去官方 github 對應的倉庫查看對應版本的 ik 以及 pinyin 分詞器。

系列文章

  • 一、和我一起打造個簡單搜索之ElasticSearch集群搭建
  • 二、和我一起打造個簡單搜索之ElasticSearch入門
  • 三、和我一起打造個簡單搜索之IK分詞以及拼音分詞
  • 四、和我一起打造個簡單搜索之Logstash實時同步建立索引
  • 五、和我一起打造個簡單搜索之SpringDataElasticSearch入門
  • 六、和我一起打造個簡單搜索之SpringDataElasticSearch關鍵詞高亮
  • ...

安裝 ik 分詞器

前文中,我們已經安裝了 elasticsearch,我們在其基礎上安裝分詞器

cd /usr/local/es/

## 下載 ik 分詞器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.3/elasticsearch-analysis-ik-5.5.3.zip

## 使用 unzip 解壓
## 如果未安裝,通過 yum instal unzip 進行安裝
unzip elasticsearch-analysis-ik-5.5.3.zip


## 在 elasticsearch 安裝目錄下的 plugins 文件夾下創建 ik 目錄
mkdir /usr/local/es/master/plugins/ik

## 將解壓後的 ik 目錄下的所有文件移動到  /usr/local/es/master/plugins/ik/
mv /usr/local/es/elasticsearch/* /usr/local/es/master/plugins/ik/

## 重啟 elasticsearch 或啟動 master elasticsearch
## 註意啟動時,需要切換到 esuser 用戶


## 啟動成功後,日誌裏會打印此行
[2018-09-02T06:33:43,703][INFO ][o.e.p.PluginsService     ] [master] loaded plugin [analysis-ik]

驗證 ik 分詞器是否生效

打開 Restlet Client 或者 postman 工具

GET http://192.168.199.192:9200/_analyze?analyzer=ik_smart&text="中華人民共和國國歌"

移除名為 ik 的analyzer和tokenizer,請分別使用 ik_smart 和 ik_max_word
ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;
ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。

這裏 analyzer 可以指定分詞類型,發送請求返回結果:

{
    "tokens": [
        {
            "token": "中華人民共和國",
            "start_offset": 1,
            "end_offset": 8,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "國歌",
            "start_offset": 8,
            "end_offset": 10,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

我這裏指定的 analyzer 為 ik_smart,即粗粒度分詞,可以看到 ik 分詞器已經生效了。接下來繼續安裝 pinyin 分詞器。

安裝 pinyin 分詞器

cd /usr/local/es/

## 下載 pinyin 分詞器
wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v5.5.3/elasticsearch-analysis-pinyin-5.5.3.zip

## 使用 unzip 解壓
## 如果未安裝,通過 yum instal unzip 進行安裝
unzip elasticsearch-analysis-pinyin-5.5.3.zip


## 在 elasticsearch 安裝目錄下的 plugins 文件夾下創建 pinyin 目錄
mkdir /usr/local/es/master/plugins/pinyin

## 將解壓後的 ik 目錄下的所有文件移動到  /usr/local/es/master/plugins/pinyin/
mv /usr/local/es/elasticsearch/* /usr/local/es/master/plugins/pinyin/

## 重啟 elasticsearch 或啟動 master elasticsearch
## 註意啟動時,需要切換到 esuser 用戶


## 啟動成功後,日誌裏打印
[2018-09-02T07:04:56,203][INFO ][o.e.p.PluginsService     ] [master] loaded plugin [analysis-ik]
[2018-09-02T07:04:56,203][INFO ][o.e.p.PluginsService     ] [master] loaded plugin [analysis-pinyin]

驗證 pinyin 分詞器是否生效

打開 Restlet Client 或者 postman 工具

GET http://192.168.199.192:9200/_analyze?analyzer=pinyin&text="李小龍"

這裏 analyzer 可以指定分詞為 pinyin,發送請求返回結果:

{
    "tokens": [
        {
            "token": "li",
            "start_offset": 1,
            "end_offset": 2,
            "type": "word",
            "position": 0
        },
        {
            "token": "xiao",
            "start_offset": 2,
            "end_offset": 3,
            "type": "word",
            "position": 1
        },
        {
            "token": "long",
            "start_offset": 3,
            "end_offset": 4,
            "type": "word",
            "position": 2
        },
        {
            "token": "lxl",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 2
        }
    ]
}

觀察結果,說明 pinyin 分詞器也已經生效了。

集群其他節點分詞器安裝

現在只對 master 進行了安裝,其他 slave 也需要安裝,這裏可以通過拷貝的方式直接來完成安裝了。

cp -r master/plugins/ slave1/

cp -r master/plugins/ slave2/

如果其他節點在不同服務器上,通過 scp 命令拷貝即可。

有疑問?

歡迎來信,給我寫信

參考

  • https://github.com/medcl/elasticsearch-analysis-pinyin/issues/19

和我一起打造個簡單搜索之IK分詞以及拼音分詞