Elasticsearch分词器

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 。

猜你喜欢

转载自blog.csdn.net/qq_44918331/article/details/111036560