## 什么是分词
```
把文本转换为一个个的单词,分词称之为analysis。es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体。
```
## es内置分词器
```
- standard:默认分词,单词会被拆分,大小会转换为小写。
- simple:按照非字母分词。大写转为小写。
- whitespace:按照空格分词。忽略大小写。
- stop:去除无意义单词,比如the/a/an/is…
- keyword:不做分词。把整个文本作为一个单独的关键词
```
## 分词可用方案
```
分词器 优势 劣势
Smart Chinese Analysis 官方插件 中文分词效果惨不忍睹
IKAnalyzer 简单易用,支持自定义词典和远程词典 词库需要自行维护,不支持词性识别
结巴分词 新词识别功能 不支持词性识别
Ansj中文分词 分词精准度不错,支持词性识别 对标hanlp词库略少,学习成本高
Hanlp 目前词库最完善,支持的特性非常多 需要更优的分词效果,学习成本高
```
## IK中文分词器
```
- ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
- ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
```
## IK词库拓展
### 静态拓展
```
方法:在ik config目录下添加xxx.dic,然后在IKAnalyzer.cfg.xml配置拓展路径
优点:可以加载大量数据
缺点:不能立即生效,需要重启es
```
### 动态拓展
```
方法:先在一个服务内提供一个xxx.dic静态文件,然后在IKAnalyzer.cfg.xml配置动态拓展路径
优点:热部署,立即生效
缺点:重复请求可能会带来性能问题
原理:IK内部定义了一个监控线程,每隔一分钟发出请求,获取Last-Modify和ETags(由IK内部自己定义管理),检测是否有变化,没变化休眠一分钟,有变化则更新词库
注意: 默认情况下, 最多一分钟之内就可以识别到新增的词语。
```
### 扩展停止词库
```
方法跟上面的一致,扩展停止词中的词会被过滤掉
```
## 拼音分词
```
- pinyin: 按照中文拼音分词。
```
## 中文拼音结合自定义分词
```
首先要先手动创建索引,添加自定义分词类型
```
```
# 自定义分词类型
put /es-article
{
"settings": {
"analysis": {
"analyzer": {
"ik_smart_pinyin": {
"type": "custom",
"tokenizer": "ik_smart",
"filter": ["my_pinyin", "word_delimiter"]
},
"ik_max_word_pinyin": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["my_pinyin", "word_delimiter"]
}
},
"filter": {
"my_pinyin": {
"type" : "pinyin",
"keep_first_letter":true,
"keep_separate_first_letter" : true,
"keep_full_pinyin" : true,
"keep_original" : true,
"limit_first_letter_length" : 16,
"lowercase" : true,
"remove_duplicated_term" : true
} } } } }
```
```
然后再手动设置_mapping关系
elasticsearchTemplate.putMapping(Article.class);
```