ElasticSearch本身帶有分詞插件,對英文支持的很好,但對中文支持的就不好了,把中文都分成了單個文字
所以我們安裝一個支持中文的插件IK
1.下載安裝IK
下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
選擇對應的版本,我這里下載的是7.6.2的版本
下載后,解壓到安裝目錄下的plugin目錄里
然后再重啟一下ElasticSearch
看到加載了我們新安裝的插件
2.測試使用
我們使用postman來測試
報錯了,analyzer參數可能是錯的,我們查一下文檔
我們修改一下analyzer參數為ik_max_word
{ "tokens": [ { "token": "postman", "start_offset": 0, "end_offset": 7, "type": "ENGLISH", "position": 0 }, { "token": "是", "start_offset": 7, "end_offset": 8, "type": "CN_CHAR", "position": 1 }, { "token": "一個", "start_offset": 8, "end_offset": 10, "type": "CN_WORD", "position": 2 }, { "token": "一", "start_offset": 8, "end_offset": 9, "type": "TYPE_CNUM", "position": 3 }, { "token": "個", "start_offset": 9, "end_offset": 10, "type": "COUNT", "position": 4 }, { "token": "不錯", "start_offset": 10, "end_offset": 12, "type": "CN_WORD", "position": 5 }, { "token": "的", "start_offset": 12, "end_offset": 13, "type": "CN_CHAR", "position": 6 }, { "token": "測試", "start_offset": 13, "end_offset": 15, "type": "CN_WORD", "position": 7 }, { "token": "試工", "start_offset": 14, "end_offset": 16, "type": "CN_WORD", "position": 8 }, { "token": "工具", "start_offset": 15, "end_offset": 17, "type": "CN_WORD", "position": 9 } ] }
這次是正確的啦,是我們想要的結果了。
3.其他
a)附帶了解一下Analyzer與Tokenizer
https://blog.csdn.net/u014078154/article/details/80135703
Analyzer包含兩個核心組件,Tokenizer以及TokenFilter。兩者的區別在於,前者在字符級別處理流,而后者則在詞語級別處理流。Tokenizer是Analyzer的第一步,其構造函數接收一個Reader作為參數,而TokenFilter則是一個類似的攔截器,其參數可以是TokenStream、Tokenizer。
1)Tokenizer
輸入為Reader的TokenStream,其子類必須實現incrementToken()函數,並且在設置屬性(attributes) 必須調用AttributeSource中的clearAttributes()方法。
b)ik_max_word 和 ik_smart 什么區別?
https://github.com/medcl/elasticsearch-analysis-ik
ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合,適合 Term Query;
ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”,適合 Phrase 查詢。