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过滤器,它们 按顺序应⽤。
