ElasticSearch 分词器
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 。