11. IK分詞器
NOTE: 默認ES中采用標準分詞器進行分詞,這種方式并不適用于中文網(wǎng)站,因此需要修改ES對中文友好分詞,從而達到更佳的搜索的效果。
11.1 在線安裝IK
在線安裝IK (v5.5.1版本后開始支持在線安裝 )
# 0.必須將es服務中原始數(shù)據(jù)刪除
- 以root用戶進入es安裝目錄中將data目錄數(shù)據(jù)刪除
rm -rf data
# 1. 在es安裝目錄中執(zhí)行如下命令
[es@linux elasticsearch-6.8.0]$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
[=================================================] 100%
-> Installed analysis-ik
[es@linux elasticsearch-6.8.0]$ ls plugins/
analysis-ik
[es@linux elasticsearch-6.8.0]$ cd plugins/analysis-ik/
[es@linux analysis-ik]$ ls
commons-codec-1.9.jar elasticsearch-analysis-ik-6.8.0.jar httpcore-4.4.4.jar
commons-logging-1.2.jar httpclient-4.5.2.jar plugin-descriptor.properties
# 2. 重啟es生效
./elasticsearch
# 3.測試ik安裝成功
GET /_analyze
{
"text": "中華人民共和國國歌",
"analyzer": "ik_smart"
}
# 4.在線安裝IK配置文件
- es安裝目錄中config目錄analysis-ik/IKAnalyzer.cfg.xml
NOTE: 要求版本嚴格與當前使用版本一致,如需使用其他版本替換
6.2.4為使用的版本號
11.2 本地安裝IK
可以將對應的IK分詞器下載到本地,然后再安裝 NOTE: 本課程使用本地安裝
# 1. 下載對應版本
- [es@linux ~]$ wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip
# 2. 解壓
- [es@linux ~]$ unzip elasticsearch-analysis-ik-6.2.4.zip #先使用yum install -y unzip
# 3. 移動到es安裝目錄的plugins目錄中
- [es@linux ~]$ ls elasticsearch-6.2.4/plugins/
[es@linux ~]$ mv elasticsearch elasticsearch-6.2.4/plugins/
[es@linux ~]$ ls elasticsearch-6.2.4/plugins/
elasticsearch
[es@linux ~]$ ls elasticsearch-6.2.4/plugins/elasticsearch/
commons-codec-1.9.jar config httpclient-4.5.2.jar plugin-descriptor.properties
commons-logging-1.2.jar elasticsearch-analysis-ik-6.2.4.jar httpcore-4.4.4.jar
# 4. 重啟es生效
# 5. 本地安裝ik配置目錄為
- es安裝目錄中/plugins/analysis-ik/config/IKAnalyzer.cfg.xml
11.3 測試IK分詞器
NOTE: IK分詞器提供了兩種mapping類型用來做文檔的分詞分別是
ik_max_word和ik_smart
ik_max_word 和 ik_smart 什么區(qū)別??
ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;?
ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。
測試數(shù)據(jù)
DELETE /ems
PUT /ems
{
"mappings":{
"emp":{
"properties":{
"name":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"age":{
"type":"integer"
},
"bir":{
"type":"date"
},
"content":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"address":{
"type":"keyword"
}
}
}
}
}
PUT /ems/emp/_bulk
{"index":{}}
{"name":"小黑","age":23,"bir":"2012-12-12","content":"為開發(fā)團隊選擇一款優(yōu)秀的MVC框架是件難事兒,在眾多可行的方案中決擇需要很高的經(jīng)驗和水平","address":"北京"}
{"index":{}}
{"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式","address":"上海"}
{"index":{}}
{"name":"張小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作為Java 語言的微服務框架,它依賴于Spring Boot,有快速開發(fā)、持續(xù)交付和容易部署等特點。Spring Cloud 的組件非常多,涉及微服務的方方面面,井在開源社區(qū)Spring 和Netflix 、Pivotal 兩大公司的推動下越來越完善","address":"無錫"}
{"index":{}}
{"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目標是致力于全方位的簡化Java開發(fā)。 這勢必引出更多的解釋, Spring是如何簡化Java開發(fā)的?","address":"南京"}
{"index":{}}
{"name":"梅超風","age":43,"bir":"2012-12-12","content":"Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API","address":"杭州"}
{"index":{}}
{"name":"張無忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口","address":"北京"}
GET /ems/emp/_search
{
"query":{
"term":{
"content":"框架"
}
},
"highlight": {
"pre_tags": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"fields": {
"*":{}
}
}
}
11.4 配置擴展詞
IK支持自定義
擴展詞典和停用詞典,所謂擴展詞典就是有些詞并不是關鍵詞,但是也希望被ES用來作為檢索的關鍵詞,可以將這些詞加入擴展詞典。停用詞典就是有些詞是關鍵詞,但是出于業(yè)務場景不想使用這些關鍵詞被檢索到,可以將這些詞放入停用詞典。如何定義擴展詞典和停用詞典可以修改IK分詞器中
config目錄中analysis-ik文件夾中的IKAnalyzer.cfg.xml這個文件。NOTE:詞典的編碼必須為UTF-8,否則無法生效
1. 修改vim IKAnalyzer.cfg.xml
<?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">ext_dict.dic</entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
2. 在ik分詞器目錄下config目錄中analysis-ik文件夾創(chuàng)建ext_dict.dic文件 編碼一定要為UTF-8才能生效(直接復制main.dic改名ext_dict.dic)
vim ext_dict.dic 加入擴展詞即可
3. 在ik分詞器目錄下config目錄中analysis-ik文件夾創(chuàng)建ext_stopword.dic文件
vim ext_stopword.dic 加入停用詞即可
4.重啟es生效
GET /ems/emp/_search
{
"query": {
"query_string": {
"query": "碰瓷",
"analyzer": "ik_max_word",
"fields": ["name","content"]
}
}
}
配置IK遠程拓展詞典和停用詞典:
為什么要有遠程拓展字典呢?
因為我們以后站內會產(chǎn)生一些新詞,當我們redis里記錄的這個新詞的超過1萬詞,我們就將其更新到我們項目中的拓展文件,es回去讀取我們的拓展文件。

將下面紅框的地址改成項目中拓展字典文件比如我們springems項目中的拓展文件.txt
