在上一節(jié)中挪丢,我們給大家介紹了ES的分析器,我相信大家對ES的全文搜索已經(jīng)有了深刻的印象卢厂。分析器包含3個部分:字符過濾器乾蓬、分詞器、分詞過濾器慎恒。在上一節(jié)的例子任内,大家發(fā)現(xiàn)了,都是英文的例子巧号,是吧族奢?因為ES是外國人寫的嘛姥闭,中國如果要在這方面趕上來丹鸿,還是需要屏幕前的小伙伴們的~
英文呢,我們可以按照空格將一句話棚品、一篇文章進行分詞靠欢,然后對分詞進行過濾廊敌,最后留下有意義的詞。但是中文怎么分呢门怪?中文的一句話是沒有空格的骡澈,這就要有一個強大的中文詞庫,當你的內(nèi)容中出現(xiàn)這個詞時掷空,就會將這個詞提煉出來肋殴。這里大家也不用重復造輪子,經(jīng)過前輩的努力坦弟,這個中文的分詞器已經(jīng)有了护锤,它就是今天要給大家介紹的IK中文分詞器。
IK中文分詞器的安裝
ES默認是沒有IK中文分詞器的酿傍,我們要將IK中文分詞器作為一個插件安裝到ES中烙懦,安裝的步驟也很簡單:
從GitHub上下載適合自己ES版本的IK中文分詞器,地址如下:
https://github.com/medcl/elasticsearch-analysis-ik/releases
赤炒。-
在我們的ES的插件目錄中(
${ES_HOME}/plugins
)創(chuàng)建ik
目錄氯析,mkdir ik
將我們下載好的IK分詞器解壓到
ik
目錄,這里我們安裝unzip
命令莺褒,進行解壓掩缓。重啟我們所有的ES服務。
到這里癣朗,我們的IK中文分詞器就安裝完了。
IK中文分詞器初探
在上一節(jié)我們訪問了ES的分析器接口旷余,指定了分析器和文本的內(nèi)容绢记,我們就可以看到分詞的結果蠢熄。那么既然我們已經(jīng)安裝了Ik中文分詞器,當然要看一下效果了饥追。在看效果之前但绕,我們先要說一下,IK中文分詞器插件給我們提供了兩個分析器捏顺。
- ik_max_word: 會將文本做最細粒度的拆分
- ik_smart:會做最粗粒度的拆分
我們先看看ik_max_word
的分析效果吧幅骄,
POST _analyze
{
"analyzer": "ik_max_word",
"text": "中華人民共和國國歌"
}
我們指定分詞器為ik_max_word
,文本內(nèi)容為中華人民共和國國歌
主巍。我們看一下分詞的結果:
{
"tokens": [
{
"token": "中華人民共和國",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
},
{
"token": "中華人民",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "中華",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 2
},
{
"token": "華人",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 3
},
{
"token": "人民共和國",
"start_offset": 2,
"end_offset": 7,
"type": "CN_WORD",
"position": 4
},
{
"token": "人民",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 5
},
{
"token": "共和國",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 6
},
{
"token": "共和",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 7
},
{
"token": "國",
"start_offset": 6,
"end_offset": 7,
"type": "CN_CHAR",
"position": 8
},
{
"token": "國歌",
"start_offset": 7,
"end_offset": 9,
"type": "CN_WORD",
"position": 9
}
]
}
我們可以看到岖赋,分詞分的非常細选脊,我們在使用上面的這些進行搜索時恳啥,都可以搜索到中華人民共和國國歌
這個文本钝的。我們再看一下另外一個分析器ik_smart
硝桩,
POST _analyze
{
"analyzer": "ik_smart",
"text": "中華人民共和國國歌"
}
我們的文本內(nèi)容同樣是中華人民共和國國歌
,看一下分詞的效果衙伶,
{
"tokens": [
{
"token": "中華人民共和國",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
},
{
"token": "國歌",
"start_offset": 7,
"end_offset": 9,
"type": "CN_WORD",
"position": 1
}
]
}
同樣的文本矢劲,使用ik_smart
進行分詞時芬沉,只分成了兩個詞,和ik_max_word
分詞器比少了很多蹦漠。這就是兩個分詞器的區(qū)別,不過這兩個分析器都是可以對中文進行分詞的隘击。
創(chuàng)建索引時指定IK分詞器
既然我們安裝了IK中文分詞器的插件研铆,那么我們在創(chuàng)建索引時就可以為text
類型的字段指定IK中文分詞器了棵红。來看看下面的例子,
PUT ik_index
{
"mappings": {
"properties": {
"id": {
"type": "long"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
我們創(chuàng)建了索引ik_index
逆甜,并且為字段title
指定了分詞器ik_max_word
交煞。我們執(zhí)行一下,創(chuàng)建成功素征。然后我們再通過GET
請求看一下這個索引的映射情況。
GET ik_index/_mapping
返回的結果如下:
{
"ik_index": {
"mappings": {
"properties": {
"id": {
"type": "long"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
我們可以看到title
字段的分析器是ik_max_word
根欧。
為索引指定默認IK分詞器
在上一節(jié)中咽块,我們已經(jīng)給大家介紹了為索引指定默認分詞器的方法欺税,這里我們直接把分詞器改為IK分詞器就可以了,如下:
PUT ik_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "ik_max_word"
}
}
}
}
}
這樣我們在索引中就不用創(chuàng)建每一個字段亭罪,可以通過動態(tài)字段映射应役,將String
類型的字段映射為text
類型,同時分詞器指定為ik_max_word
院崇。我們試一下袍祖,向ik_index
索引中添加一條記錄蕉陋。
POST ik_index/_doc/1
{
"id": 1,
"title": "大興龐各莊的西瓜",
"desc": "大興龐各莊的西瓜真是好吃,脆沙瓤茁肠,甜掉牙"
}
執(zhí)行成功缩举。我們再執(zhí)行搜索試一下仅孩,如下:
POST ik_index/_search
{
"query": { "match": { "title": "西瓜" } }
}
我們搜索title
字段匹配西瓜
,執(zhí)行結果如下:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "ik_index",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"id": 1,
"title": "大興龐各莊的西瓜",
"desc": "大興龐各莊的西瓜真是好吃站刑,脆沙瓤绞旅,甜掉牙"
}
}
]
}
}
我們可以看到剛才插入的那條記錄已經(jīng)搜索出來了因悲,看來我們的IK中文分詞器起作用了勺爱,而且搜索的結果也符合我們的預期。我們再看看搜索西
一個字的時候卫旱,能不能搜索到結果围段,
POST ik_index/_search
{
"query": { "match": { "title": "西" } }
}
執(zhí)行結果如下:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
并沒有搜索出結果奈泪,說明在進行分詞時,西瓜
是作為一個詞出現(xiàn)的拜姿,并沒有拆分成每一個字,這也是符合我們預期的蕊肥。
好了~ 這一節(jié)的IK中文分詞器就給大家介紹到這里了~~