欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ElasticSearch 分词器

程序员文章站 2022-10-04 09:14:14
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目录。这种方式下载速度很慢,不推荐。

 

 

到官网下载相关插件

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  。