ELK系列(十)、ES中文分詞器IK插件安裝和配置遠程詞庫熱加載

簡介

  1. IK Analyzer是一個開源的,基於Java語言開發的輕量級的中文分詞工具包;
  2. 最初,它是以開源項目Luence 爲應用主體的,結合詞典分詞和文法分析算法的中文分詞組件;從 3.0 版本開始,IK 發展爲面向 Java 的公用分詞組件,獨立亍 Lucene 項目,同時提供了對 Lucene 的默認優化實現。在 2012 版本中,IK 實現了簡單的分詞歧義排除算法,標誌着 IK 分詞器從單純的詞典分詞向模擬語義分詞衍化;

本篇就介紹如何給ES安裝插件,以及使用ik中文分詞器進行搜索,最後介紹一下如何熱加載自定義詞庫。

ELK系列(一)、安裝ElasticSearch+Logstash+Kibana+Filebeat-v7.7.0

ELK系列(二)、在Kibana中使用RESTful操作ES庫

ELK系列(三)、安裝Logstash插件及打包離線安裝包

ELK系列(四)、Logstash讀取nginx日誌寫入ES中

ELK系列(五)、Logstash修改@timestamp時間爲日誌的產生時間

ELK系列(六)、修改Nginx日誌爲Json格式並使用Logstash導入至ES

ELK系列(七)、Filebeat+Logstash採集多個日誌文件並寫入不同的ES索引中

ELK系列(八)、使用Filebeat+Redis+Logstash收集日誌數據

ELK系列(九)、配置ES和Kibana的用戶密碼

---------------------------------------ES中文分詞器ik-----------------------------------------

安裝

下載

https://github.com/medcl/elasticsearch-analysis-ik

https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip

我使用的es7.7.0,所以我下載ik7.7.0,版本和es一一對應的。

安裝

傳到服務器上執行下面的命令解壓:

mkdir ik

mv elasticsearch-analysis-ik-7.7.0.zip ik/

cd ik

unzip elasticsearch-analysis-ik-7.7.0.zip
rm -rf elasticsearch-analysis-ik-7.7.0.zip

 然後將該目錄移動到$ES_HOME/plugins目錄下,重啓ES即可:

mv ik /opt/app/elasticsearch-7.7.0/plugins/
sudo -u elk nohup $ES_HOME/bin/elasticsearch >> $ES_HOME/output.log 2>&1 &

使用

建索引

在ES中建索引以及mapping:

#建索引
PUT /csdn

#建mapping
POST /csdn/_mapping
{
  "properties": {
    "content":{
      "type": "text", 
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word"
    }
  }
}

#查看mapping
GET /csdn/_mapping


#建沒有使用分詞器的索引對比
PUT /wyk

造數據

例子:同時往csdnwyk兩個索引中插入同樣的數據

POST /csdn/_doc/1
{
  "content":"特朗普暴打川普"
}

POST /csdn/_doc/2
{
  "content":"特朗普和本拉登的愛恨情仇"
}

POST /csdn/_doc/3
{
  "content":"美國白宮裏有頭豬會說普通的english"
}

POST /csdn/_doc/4
{
  "content":"川普!=川建國"
}

POST /wyk/_doc/1
{
  "content":"特朗普暴打川普"
}

POST /wyk/_doc/2
{
  "content":"特朗普和本拉登的愛恨情仇"
}

POST /wyk/_doc/3
{
  "content":"美國白宮裏有頭豬會說普通的english"
}

POST /wyk/_doc/4
{
  "content":"川普!=川建國"
}

查詢

使用命令查看分詞的效果,三種模式:

如,查看"中華人民共和國" 在ik分詞下的效果和默認情況的效果:

#ik分詞 max模式 "細粒度"
GET /csdn/_analyze
{
  "text":"普通的",
  "tokenizer": "ik_max_word"
}

#ik分詞 smart模式 "粗粒度"
GET /csdn/_analyze
{
  "text":"普通的",
  "tokenizer": "ik_smart"
}

#ES默認,中文每個字符一個詞
GET /csdn/_analyze
{
  "text":"普通的",
  "tokenizer": "standard"
}

 

然後我們查詢上面造的數據中包含"普通的"關鍵字的數據,如下圖所示,可以看到,因爲wyk索引下沒有使用ik分詞,因此只要數據中有"普","通","的" 三個字符之一的結果都會展示出來,而在索引csdn因爲用了ik分詞,ik分詞下"普通的"會被分爲"普通""的",因此只有包含了"普通"或"的"的結果纔會顯示:

GET /csdn/_doc/_search
{
  "query": {
    "match": {
      "content": "普通的"
    }
  }
}


GET /wyk/_doc/_search
{
  "query": {
    "match": {
      "content": "普通的"
    }
  }
}

查詢高亮

很多時候我們在百度,或者CSDN進行搜索的時候,返回給我們的結果會把我們的查詢關鍵字高亮顯示,很直觀的就可以看到自己想要的信息,像下面這樣的查詢結果高亮顯示,使用ik可以很方便的將匹配到的結果加上標籤返回,對前端開發很友好,我們也可以根據標籤的位置看出分詞的效果:

GET /csdn/_doc/_search
{
  "query": {
    "match": {
      "content": "普通的"
    }
  },
  "highlight": {
    "pre_tags" : ["<strong>", "<tag2>"],
        "post_tags" : ["</strong>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
  }
}

自定義詞庫

業務詞彙或者是人名或者是新出來的網絡詞彙,在分詞器中都無法正確的識別,我們可以自己爲IK分詞器擴展詞庫,這裏演示如何使用nginx上的遠程靜態文件來配置詞彙:

準備工作

在nginx服務器上準備一個.txt文件,必須是utf-8編碼:

配置

修改ik分詞庫的配置文件:

vim /opt/app/elasticsearch-7.7.0/plugins/ik/config/IKAnalyzer.cfg.xml

<!--修改這一行即可,指向自己的遠程靜態文件-->
<entry key="remote_ext_dict">http://wykd/wyk/csdn_dict.txt</entry> 

重啓ES

修改了插件配置之後需要重啓,如果之後對遠程的詞庫.txt文件修改就不需要再重啓ES了,該插件支持熱更新分詞。

#jps查看es進程殺掉ES
kill -9 xxxx

#啓動
sudo -u elk nohup $ES_HOME/bin/elasticsearch >> $ES_HOME/output.log 2>&1 &

驗證

如上圖,我在詞庫里加了一個"王義凱"的單詞,在使用ik分詞分析的時候會當成一個詞,而默認的分詞只會當做三個字去處理:

測試擴展詞庫的分詞效果:

POST /csdn/_doc/1
{
  "content":"正義不會缺席"
}

POST /csdn/_doc/2
{
  "content":"國王的新衣"
}

POST /csdn/_doc/3
{
  "content":"等待你們的凱旋而歸"
}

POST /csdn/_doc/4
{
  "content":"這是王義凱的博客"
}

POST /wyk/_doc/1
{
  "content":"正義不會缺席"
}

POST /wyk/_doc/2
{
  "content":"國王的新衣"
}

POST /wyk/_doc/3
{
  "content":"等待你們的凱旋而歸"
}

POST /wyk/_doc/4
{
  "content":"這是王義凱的博客"
}

 

----------------------

Q:ik_max_word 和 ik_smart 什麼區別?

A:ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分爲“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合,適合 Term Query;

ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分爲“中華人民共和國,國歌”,適合 Phrase 查詢。

 

希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章