1、IK分詞器簡介
????????IKAnalyzer是一個開源的,基于java語言開發(fā)的輕量級的中文分詞工具包。從2006年12月推出1.0版開始IKAnalyzer已經(jīng)推出 了3個大版本。最初,它是以開源項目Lucene為應(yīng)用主體的,結(jié)合詞典分詞和文法分析算法的中文分詞組件。新版本的IKAnalyzer3.0則發(fā)展為 面向Java的公用分詞組件,獨立于Lucene項目,同時提供了對Lucene的默認優(yōu)化實現(xiàn)。
IK分詞器3.0的特性如下:
- 1)采用了特有的“正向迭代最細粒度切分算法“,具有60萬字/秒的高速處理能力。
- 2)采用了多子處理器分析模式,支持:英文字母(IP地址、Email、URL)、數(shù)字(日期,常用中文數(shù)量詞,羅馬數(shù)字,科學(xué)計數(shù)法),中文詞匯(姓名、地名處理)等分詞處理。
- 3)對中英聯(lián)合支持不是很好,在這方面的處理比較麻煩.需再做一次查詢,同時是支持個人詞條的優(yōu)化的詞典存儲,更小的內(nèi)存占用。
- 4)支持用戶詞典擴展定義。
- 5)針對Lucene全文檢索優(yōu)化的查詢分析器IKQueryParser;采用歧義分析算法優(yōu)化查詢關(guān)鍵字的搜索排列組合,能極大的提高Lucene檢索的命中率。
????????當(dāng)我們創(chuàng)建索引時,字段使用的是標準分詞器,所以在查詢的時候時常出現(xiàn)問題。
????????Standard 標準分詞:es默認的,如果是英文按單詞切分,并且會轉(zhuǎn)化成小寫,如果是中文的話,則按一個詞切分。
2、ES集成IK分詞器
2.1、IK分詞器的安裝
1、下載地址:Releases · medcl/elasticsearch-analysis-ik · GitHub
注意:下載時一定要下載與當(dāng)前ES版本一致的分詞器版本,免得出現(xiàn)一些其他問題。
?2、解壓 unzip elasticsearch-analysis-ik-6.8.2.zip -d ?elasticsearch-analysis-ik-6.8.2,將解壓后的elasticsearch-analysis-ik-6.8.2文件夾拷貝到elasticsearch-6.8.2/plugins下,并重命名文件夾為ik。
?3、重啟es,即可加載ik分詞器。
2.2、IK分詞器測試
IK提供了兩個分詞算法ik_smart 和 ik_max_word
- ik_smart:為最少切分
- ik_max_word:為最細粒度劃分。
2.2.1、最小切分示例
#分詞器測試ik_smart
POST _analyze
{
"analyzer":"ik_smart",
"text":"我是中國人"
}
?結(jié)果:
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中國人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
}
]
}
2.2.2、最細切分示例
#分詞器測試ik_max_word
POST _analyze
{
"analyzer":"ik_max_word",
"text":"我是中國人"
}
結(jié)果:
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中國人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "中國",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "國人",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 4
}
]
}
3、IK分詞器為何如此智能
????????通過上面的示例我們也看到了,這種中文的分詞效果是ES內(nèi)置的分詞器無法比擬的。那么它是如何做到的呢?不要過于驚訝,因為原理其實非常簡單,它是通過索引字典來達到的,這樣說可能比較抽象難懂,我們來實際看看ES的plugins/ik/config目錄:
3.1、ik分詞器的字典
????????看到那些*.dic結(jié)尾的文件了嗎?其實它就是dictionary(字典)的簡寫,來實際看看字典內(nèi)容:如上圖。
????????實際的詞匯量是非常巨大的,根本不可能完全收錄到字典中。如果有需要,我們完全可以通過在字典文件中增加我們想要的詞語來擴展我們自己的分詞規(guī)則。
4、擴展ik分詞器的字典
示例:
????????“麻花疼”使用ik_smart、ik_max_word 分詞后的結(jié)果都是:麻花、疼。
? ?無法分詞為一個完整的“麻花疼”,因為ik分詞器的詞典中沒有這個詞。示例如下圖:
# 麻花疼 使用ik_smart分詞
GET _analyze
{
"analyzer": "ik_smart",
"text": "麻花疼"
}
{
"tokens" : [
{
"token" : "麻花",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "疼",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
}
]
}
GET _analyze
{
"analyzer": "ik_max_word",
"text": "麻花疼"
}
{
"tokens" : [
{
"token" : "麻花",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "疼",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
}
]
}
如何將“麻花疼”分詞為一個完整的詞,需要將其添加到詞典中。
4.1、ik分詞器的配置文件目錄
?在plugins/elasticsearch-analysis-ik-6.8.2/config/config
目錄下有ik分詞配置文件:
- IKAnalyzer.cfg.xml,用來配置自定義的詞庫
- main.dic,ik原生內(nèi)置的中文詞庫,只要是這些單詞,都會被分在一起。
- surname.dic,中國的姓氏。
- suffix.dic,特殊(后綴)名詞,例如
鄉(xiāng)、江、所、省
等等。- preposition.dic,中文介詞,例如
不、也、了、仍
等等。- stopword.dic,英文停用詞庫,例如
a、an、and、the
等。- quantifier.dic,單位名詞,如
厘米、件、倍、像素
等。- extra開頭的文件,是額外的詞庫。
4.2、IKAnalyzer.cfg.xml配置文件
4.3、新增字典配置文件,后綴為dic?
在新的字段配置文件my_ik.dic中添加新詞:“麻花疼”。
注意:詞庫的編碼必須是utf-8
。
?4.4、將新增的配置文件添加到IK字典配置文件中,并重啟ES和KIBANA
?ES啟動控制臺中會顯示已經(jīng)讀取到自定義字典:
再次查詢,該詞已經(jīng)成功識別?。
4.5、IK插件還支持熱更新:
IKAnalyzer.cfg.xml配置文件中的有如下配置:
?其中?words_location
?是指一個 url,比如?http://yoursite.com/getCustomDict
,該請求只需滿足以下兩點即可完成分詞熱更新。
- 該 http 請求需要返回兩個頭部(header),一個是?
Last-Modified
,一個是?ETag
,這兩者都是字符串類型,只要有一個發(fā)生變化,該插件就會去抓取新的分詞進而更新詞庫。 - 該 http 請求返回的內(nèi)容格式是一行一個分詞,換行符用?
\n
?即可。
滿足上面兩點要求就可以實現(xiàn)熱更新分詞了,不需要重啟es 。文章來源:http://www.zghlxwxcb.cn/news/detail-822898.html
????????可以將需自動更新的熱詞放在一個?UTF-8
?編碼的?.txt
文件里,放在 nginx 或其他簡易 http server 下,當(dāng)?.txt
文件修改時,http server 會在客戶端請求該文件時自動返回相應(yīng)的 Last-Modified 和 ETag。可以另外做一個工具來從業(yè)務(wù)系統(tǒng)提取相關(guān)詞匯,并更新這個?.txt
文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-822898.html
到了這里,關(guān)于elasticsearch學(xué)習(xí)(六):IK分詞器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!