六、IK分詞器的使用
之前已經介紹了IK分詞器的下載和安裝,下面就來驗證一下:
GET _analyze
{
"analyzer": "ik_max_word",
"text": "上海自來水來自海上"
}
如果返回如下數據就說明安裝成功了:
1 ik_max_word
ik_max_word參數會將文檔做最細粒度的拆分,會窮盡各種可能的組合。
PUT ik1
{
"mappings": {
"properties":{
"title":{
"type":"text",
"analyzer": "ik_max_word"
}
}
}
}
我們創建一個索引名為ik1
,指定使用ik_max_word
分詞器,然后插入幾條數據:
PUT ik1/_doc/1
{
"content":"真開心今天吃了三頓飯"
}
PUT ik1/_doc/2
{
"content":"今天你也在煩惱嗎?笑一笑吧"
}
PUT ik1/_doc/3
{
"content":"愛笑的人運氣都不會太差"
}
現在讓我們開始查詢:
GET ik1/_search
{
"query": {
"match": {
"content": "今天"
}
}
}
GET ik1/_search
{
"query": {
"match": {
"content": "笑"
}
}
}
2 ik_smart
ik_smart是另一種分詞方式,它將文檔作粗粒度的拆分。比如,愛笑的人運氣都不會太差
這句話:
- ik_max_word會拆分為:愛笑,的人,運氣,都不會,都不,不會,太差
- ik_smart會拆分為:愛笑,的人,運氣,都不會,太差
由上面的對比可以發現,兩個參數的不同,所以查詢結果也肯定不一樣,視情況而定用什么粒度。
至於查詢,與之前介紹的查詢方法完全一樣。
3 ik目錄簡介
在ik/config
目錄下有ik分詞配置文件:
- IKAnalyzer.cfg.xml,用來配置自定義的詞庫
- main.dic,ik原生內置的中文詞庫,只要是這些單詞,都會被分在一起。
- surname.dic,中國的姓氏。
- suffix.dic,特殊(后綴)名詞,例如
鄉、江、所、省
等等。 - preposition.dic,中文介詞,例如
不、也、了、仍
等等。 - stopword.dic,英文停用詞庫,例如
a、an、and、the
等。 - quantifier.dic,單位名詞,如
厘米、件、倍、像素
等。 - extra開頭的文件,是額外的詞庫。
4 擴展詞庫
在ik/config
目錄下的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"></entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords"></entry>
<!--用戶可以在這里配置遠程擴展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
比如我們添加一個詞典,在config
目錄下新建一個new.dic
:
<entry key="ext_dict">new.dic</entry>
然后重啟es,再使用分詞器試試:
GET _analyze
{
"analyzer": "ik_smart",
"text": "奧利給干了兄弟們"
}
注意詞庫的編碼必須是utf-8
。
IK插件還支持熱更新,在配置文件中的如下配置
<!--用戶可以在這里配置遠程擴展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
其中 words_location
是指一個 url,比如 http://yoursite.com/getCustomDict
,該請求只需滿足以下兩點即可完成分詞熱更新。
- 該 http 請求需要返回兩個頭部(header),一個是
Last-Modified
,一個是ETag
,這兩者都是字符串類型,只要有一個發生變化,該插件就會去抓取新的分詞進而更新詞庫。 - 該 http 請求返回的內容格式是一行一個分詞,換行符用
\n
即可。
滿足上面兩點要求就可以實現熱更新分詞了,不需要重啟es 。
可以將需自動更新的熱詞放在一個 UTF-8
編碼的 .txt
文件里,放在 nginx 或其他簡易 http server 下,當 .txt
文件修改時,http server 會在客戶端請求該文件時自動返回相應的 Last-Modified 和 ETag。可以另外做一個工具來從業務系統提取相關詞匯,並更新這個 .txt
文件。