之前我們創建索引,查詢數據,都是使用的默認的分詞器,分詞效果不太理想,會把text的字段分成一個一個漢字,然后搜索的時候也會把搜索的句子進行分詞,所以這里就需要更加智能的分詞器IK分詞器了。
1. ik分詞器的下載和安裝,測試
第一: 下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases ,這里你需要根據你的Es的版本來下載對應版本的IK,這里我使用的是6.3.2的ES,所以就下載ik-6.3.2.zip的文件。

第二: 解壓-->將文件復制到 es的安裝目錄/plugin/ik下面即可,完成之后效果如下:

到這里已經完成了,不需要去elasticSearch的 elasticsearch.yml 文件去配置。
第三:重啟ElasticSearch
第四:測試效果
未使用ik分詞器的時候測試分詞效果:
POST book/_analyze { "text": "我是中國人" } //結果是: { "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>", "position": 1 }, { "token": "中", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>", "position": 2 }, { "token": "國", "start_offset": 3, "end_offset": 4, "type": "<IDEOGRAPHIC>", "position": 3 }, { "token": "人", "start_offset": 4, "end_offset": 5, "type": "<IDEOGRAPHIC>", "position": 4 } ] }
使用IK分詞器之后,結果如下:
POST book_v6/_analyze { "analyzer": "ik_max_word", "text": "我是中國人" } //結果如下: { "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 } ] }
對於上面兩個分詞效果的解釋:
1. 如果未安裝ik分詞器,那么,你如果寫 "analyzer": "ik_max_word",那么程序就會報錯,因為你沒有安裝ik分詞器
2. 如果你安裝了ik分詞器之后,你不指定分詞器,不加上 "analyzer": "ik_max_word" 這句話,那么其分詞效果跟你沒有安裝ik分詞器是一致的,也是分詞成每個漢字。
2. 創建指定分詞器的索引
索引創建之后就可以使用ik進行分詞了,當你使用ES搜索的時候也會使用ik對搜索語句進行分詞,進行匹配。
PUT book_v5 { "settings":{ "number_of_shards": "6", "number_of_replicas": "1", //指定分詞器 "analysis":{ "analyzer":{ "ik":{ "tokenizer":"ik_max_word" } } } }, "mappings":{ "novel":{ "properties":{ "author":{ "type":"text" }, "wordCount":{ "type":"integer" }, "publishDate":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss || yyyy-MM-dd" }, "briefIntroduction":{ "type":"text" }, "bookName":{ "type":"text" } } } } }
關於ik分詞器的分詞類型(可以根據需求進行選擇):
ik_max_word:會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;
ik_smart:會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。如下:
POST book_v6/_analyze { "analyzer": "ik_smart", "text": "我是中國人" } //結果 { "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 } ] }
