Skip to content

elasticsearch分词器

一、什么是分词器

将⽤户输⼊的⼀段⽂本,按照⼀定逻辑,分析成多个词语的⼀种⼯具

二、常用内置分词器

返回结果说明:

  • token:分成的词

  • start_offset:开始坐标

  • end_offset:结束坐标

  • type:类型,如<ALPHANUM>是英文,<NUM>是数字

  • position:词的顺序,表示分词以后的第几个词

三、standard analyzer

标准分析器是默认分词器,如果未指定,则使⽤该分词器。该分词器如果遇到特殊字符的情况下,会将特殊符号去除然后再分词

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "standard",
    "text": "Learning is a very important thing 11-12"
}

响应:

{
    "tokens": [
        {
            "token": "learning",
            "start_offset": 0,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "is",
            "start_offset": 9,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "a",
            "start_offset": 12,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "very",
            "start_offset": 14,
            "end_offset": 18,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "important",
            "start_offset": 19,
            "end_offset": 28,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "thing",
            "start_offset": 29,
            "end_offset": 34,
            "type": "<ALPHANUM>",
            "position": 5
        },
        {
            "token": "11",
            "start_offset": 36,
            "end_offset": 38,
            "type": "<NUM>",
            "position": 6
        }
    ]
}

四、simple analyzer

simple 分析器当它遇到只要不是字⺟的字符,就将⽂本解析成term,⽽且所有的term都是 ⼩写的。

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "simple",
    "text": "Learning is a very important thing 11-12"
}

五、whitespace analyzer

whitespace 分析器,当它遇到空⽩字符时,就将⽂本解析成terms

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "whitespace",
    "text": "Learning is a very important thing 11-12"
}

六、stop analyzer

stop 分析器 和 simple 分析器很像,唯⼀不同的是,stop 分析器增加了对删除停⽌词的⽀持,默认使⽤了english停⽌词

stopwords 预定义的停⽌词列表,⽐如 (the,a,an,this,of,at)等等

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "stop",
    "text": "Learning is a very important thing 11-12"
}

七、language analyzer

(特定的语⾔的分词器,⽐如说,english,英语分词器),内置语⾔:arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, finnish, french, galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, thai

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "english",
    "text": "Learning is a very important thing 11-12"
}

八、pattern analyzer

⽤正则表达式来将⽂本分割成terms,默认的正则表达式是\W+(⾮单词字符)

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "pattern",
    "text": "Learning is a very important thing 11-12"
}

九、smartCN中文分词器

先安装es的插件,bin目录下执行插件下载安装。然后重启es服务:

sh elasticsearch-plugin install analysis-smartcn

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "smartcn",
    "text": "学习是一件很重要的事情"
}

十、IK中文分词器

下载 https://github.com/medcl/elasticsearch-analysis-ik/releases。需要对应es的版本

解压安装到plugins目录下。重启es

请求:

POST "localhost:9200/_analyze"
{
    "analyzer": "ik_max_word",
    "text": "学习是一件很重要的事情"
}

十一、设置分词器

新建索引并且指定分词器

请求

PUT "localhost:9200/es1"
{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": "whitespace"
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "team_name": {
                "type": "text"
            },
            "position": {
                "type": "text"
            },
            "play_year": {
                "type": "long"
            },
            "jerse_no": {
                "type": "keyword"
            },
            "title": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

十二、分词原理

写时分词:

⽂档写⼊的时候会根据字段设置的分词器类型进⾏分词,如果不指定就是默认的standard分 词器。 写时分词器需要在mapping中指定,⽽且⼀旦指定就不能再修改,若要修改必须重建索引。

读时分词:

由于读时分词器默认与写时分词器默认保持⼀致,拿上⾯的例⼦,你搜索 msg 字段,那么读 时分词器为 Standard ,搜索 msg_chinese 时分词器则为ik_max_word。 这种默认设定也是 ⾮常容易理解的,读写采⽤⼀致的分词器,才能尽最⼤可能保证分词的结果是可以匹配的。

⼀般来讲不需要特别指定读时分词器,如果读的时候不单独设置分词器,那么读时分词器的 验证⽅法与写时⼀致。

分析器(analyzer)有三部分组成

  • char filter : 字符过滤器,字符过滤器以字符流的形式接收原始⽂本,并可以通过添加、删除或更改字符来转换该流。⼀个分 析器可能有0个或多个字符过滤器。

  • tokenizer : 分词器。⼀个分词器接收⼀个字符流,并将其拆分成单个token (通常是单个单词),并输出⼀个 token流。⽐如使⽤whitespace分词器当遇到空格的时候会将⽂本拆分成token。"eating an apple" >> [eating, and, apple]。⼀个分析器必须只能有⼀个分词器。

  • token filter :token过滤器。token过滤器接收token流,并且可能会添加、删除或更改tokens。⽐如⼀个lowercase token filter可以将所有的token转成⼩写。⼀个分析器可能有0个或多个token过滤器,它们 按顺序应⽤。