以前咱們建立索引,查詢數據,都是使用的默認的分詞器,分詞效果不太理想,會把text的字段分紅一個一個漢字,而後搜索的時候也會把搜索的句子進行分詞,因此這裏就須要更加智能的分詞器IK分詞器了。git
第一: 下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases ,這裏你須要根據你的Es的版原本下載對應版本的IK,這裏我使用的是6.3.2的ES,因此就下載ik-6.3.2.zip的文件。github
第二: 解壓-->將文件複製到 es的安裝目錄/plugin/ik下面便可,完成以後效果以下:app
到這裏已經完成了,不須要去elasticSearch的 elasticsearch.yml 文件去配置。elasticsearch
第三:重啓ElasticSearch測試
第四:測試效果spa
未使用ik分詞器的時候測試分詞效果:code
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分詞器以後,結果以下:orm
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 } ] }
對於上面兩個分詞效果的解釋:blog
1. 若是未安裝ik分詞器,那麼,你若是寫 "analyzer": "ik_max_word",那麼程序就會報錯,由於你沒有安裝ik分詞器索引
2. 若是你安裝了ik分詞器以後,你不指定分詞器,不加上 "analyzer": "ik_max_word" 這句話,那麼其分詞效果跟你沒有安裝ik分詞器是一致的,也是分詞成每一個漢字。
索引建立以後就可使用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 } ] }