簡介
- IK Analyzer是一個開源的,基於Java語言開發的輕量級的中文分詞工具包;
- 最初,它是以開源項目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讀取nginx日誌寫入ES中
ELK系列(五)、Logstash修改@timestamp時間爲日誌的產生時間
ELK系列(六)、修改Nginx日誌爲Json格式並使用Logstash導入至ES
ELK系列(七)、Filebeat+Logstash採集多個日誌文件並寫入不同的ES索引中
ELK系列(八)、使用Filebeat+Redis+Logstash收集日誌數據
---------------------------------------ES中文分詞器ik-----------------------------------------
安裝
下載
https://github.com/medcl/elasticsearch-analysis-ik
我使用的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
造數據
例子:同時往csdn和wyk兩個索引中插入同樣的數據
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 查詢。
希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!