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  。

 

posted @ 2020-04-17 23:43  chy_18883701161  阅读(1817)  评论(0编辑  收藏  举报