ES內置的6種分詞器 standard analyzer 標準分詞器,未設置分詞器時預設使用此分詞器。在空格、符號處切,中文部分切割為一個一個的漢字。 切的意思是不要了。多個連續的空格算一個空格,符號指的是!、?、@、。等 "h!ello wo2rld a b我是a中國人d" => h ello w ...
ES內置的6種分詞器
-
standard analyzer
標準分詞器,未設置分詞器時預設使用此分詞器。在空格、符號處切,中文部分切割為一個一個的漢字。
切的意思是不要了。多個連續的空格算一個空格,符號指的是!、?、@、。等
"h!ello wo2rld a b我是a中國人d" => h ello wo2rld a b 我 是 a 中 國 人
-
simple analyzer
簡單分詞器。在空格、符號、數字處切,中文部分不會切割為一個一個的漢字。
數字指的是1、2.5這種,不包括大寫的數字。
"h!ello wo2rld a b我是a中國人d" => h ello wo rld a b我是a中國人d
-
stop analyzer
停止分詞器。在空格、符號、數字、英文介詞|冠詞 處切,中文部分不會切割為一個一個的漢字。
英文介詞|冠詞指的是the、a、an、this、of、at等,註意是英文的,中文的介詞|冠詞不切。
"h!ello wo2rld a b我是a中國人d" => h ello wo rld b我是a中國人d
在英文中,冠詞|介詞前後都有一個空格,是單獨的一個詞,如果前後沒有空格,那就不算介詞|冠詞。
-
whitespace analyzer
空白符分詞器。只在空格處切。
"h!ello wo2rld a b我是a中國人d" => h!ello wo2rd a b我是a中國人d
-
language analyzer
語言分詞器。語言分詞器有很多種,把語言全小寫就是,比如english,chinese。
english、chinese的效果都一樣:在空格、符號、英文介詞|冠詞 處切,中文切割為一個一個的漢字。
-
pattern analyzer
正則表達式分詞器。根據正則表達式來切,預設使用的正則表達式是\W+,在匹配\W+的地方切。
\w包括英文字母、阿拉伯數字、_,\W是任意一個非\w字元,中文字元也算\W。
+表示一個及以上,就是說多個非\w字元算作一處。
查看分詞結果
POST 192.168.1.9:9200/_analyze #GET、POST均可 { "analyzer":"standard", #使用的分詞器 "text":"hello world!" #文本 }
返回示例
{ "tokens": [ { "token": "hello", #切割好的一塊 "start_offset": 0, #偏移量,即這一塊的在文本中的起始位置、末尾位置 "end_offset": 5, "type": "<ALPHANUM>", "position": 0 #這是拆分出來的第幾塊,從0開始 }, { "token": "world", "start_offset": 6, "end_offset": 11, "type": "<ALPHANUM>", "position": 1 } ] }
設置分詞器
設置分詞器需要在創建index時,就設置mapping,給mapping中的某些text欄位設置分詞器
PUT 192.168.1.9:9200/mall
{ "settings": { "analysis": { "analyzer": { "my_analyzer": { #分詞器的名字的可以隨便取 "type": "simple" #分詞器的類型 } } } }, "mappings": { "properties": { "goods_name": { "type": "text", "analyzer": "my_analyzer" #給此欄位設置分詞器。使用match根據此欄位搜索分詞時,會自動使用此分詞器 }, "goods_price": { "type": "float" }, "goods_description": { "type": "text" } } } }
中文分詞器
ES內置的分詞器,要麼把中文切分為一個一個的漢字,要麼就不切割中文部分,對中文分詞的實現很差。
常用的第三方的中文分詞器
- SmartCN ⼀個簡單的中⽂、中英⽂混合⽂本的分詞器
- IK 比smartCN更智能、更友好,推薦
安裝插件
cd到es的bin目錄,執行elasticsearch-plugin命令
./elasticsearch-plugin install analysis-smartcn #install後面是插件名 #./都可以用sh代替 sh elasticsearch-plugin install analysis-smartcn
插件會自動安裝到es的plugins目錄。這種方式下載速度很慢,不推薦。
到官網下載相關插件
https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis.html
SmartCN、IK都可以在這個頁面下載。插件版本要和es的版本一致,如果都是最新版,那一般都是一致的。
安利一波QQ瀏覽器,迅雷下載不了的文件我QQ瀏覽器能下。
下載後解壓,把解壓得到的文件夾上傳到es的plugins目錄下,重啟es生效。
測試下插件是否安裝成功
POST 192.168.1.9:9200/_analyze { "analyzer": "smartcn", "text": "小米筆記本" }
SmartCN的分詞器名稱是 smartcn ,IK的是 ik_max_word 。
SmartCN有時候不夠智能,比如“小米10pro”,會拆分為 小 米 10 pro
IK更加智能,拆分為 小米 10pro 10 pro,會從不同的粗細層面進行拆分。
卸載插件
執行es bin目錄下的elasticsearch-plugin命令,最後面是插件名
./elasticsearch-plugin remove analysis-smartcn
SmartCN的插件名是 analysis-smartcn ,IK的插件名是 ik_smart 。