分词器
分词就是将一段文本按照一定的规则切分成以一个一个的关键字的过程
简介
ElasticSearch的分词器(Analyzer)一般由三种组件构成:
character filter
字符过滤器:在一段文本分词之前,先进行预处理,比如说最常见的就是 【过滤html标签】,<span>hello<span> --> hello
,I & you --> I and you
tokenizers
分词器:默认情况下,英文分词根据空格将单词分开;中文分词按单字隔开,也可以采用机器学习算法来分词Token filters
Token过滤器:将切分的单词进行加工,大小写转换,去掉停用词(例如“a”、“and”、“the”等等 ),加入同义词(例如同义词像“jump”和“leap”)
⚠️三者的顺序:
- 三者顺序: Character Filters—>Tokenizer—>Token Filter
- 三者个数:Character Filters(0个或多个) + Tokenizer + Token Filters(0个或多个)
分类
- Standard Analyzer - 默认分词器,英文按单词词切分,并小写处理
- Simple Analyzer - 按照单词切分(符号被过滤), 小写处理
- Stop Analyzer - 小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer - 按照空格切分,不转小写
- Keyword Analyzer - 不分词,直接将输入当作输出
创建索引时设置分词器
PUT /索引名
{
"settings": {},
"mappings": {
"properties": {
"title":{
"type": "text",
"analyzer": "standard" //显示指定分词器
}
}
}
}
内置分词器
标准分词器
- 英文按照单词分词,统一转为小写,过滤标点符号;
- 中文单字分词
POST /_analyze
{
"analyzer": "standard",
"text": "this is a , good Man 中华人民共和国"
}
Simple分词器
- 英文按照单词分词 英文统一转为小写 去掉符号
- 中文按照标点符号(逗号、句号、包括空格等等)进行分词
POST /_analyze
{
"analyzer": "simple",
"text": "this is a , good Man 中华人民共和国"
}
Whitespace 分词器
中文和英文都按照空格分词 ,英文不会转为小写 , 不去掉标点符号
POST /_analyze
{
"analyzer": "whitespace",
"text": "this is a , good Man"
}
中文分词器
在ES中支持中文分词器非常多 如 smartCN、IK 等,推荐的就是
IK分词器
。
安装IK
- 安装方式不止一种,我这里选择的是在线安装
- 必须要注意的是ik分词器的版本必须必须和ES强一致
1.进入容器内部
dockerexec -it 容器Id bash
2.在线下载
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip
3.退出容器并重启
//退出
exit
//重启
docker restart 容器id
4.进入容器查看插件目录
docker exec -it 容器Id bash
cd plugins/
IK使用
IK分词器有两种粒度划分:
ik_smart
: 会做最粗粒度的拆分ik_max_word
: 会将文本做最细粒度的拆分
POST /_analyze
{
"text":"中华民族共和国国歌",
"analyzer":"ik_smart"
}
{
"tokens" : [
{
"token" : "中华民族",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "共和国",
"start_offset" : 4,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "国歌",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 2
}
]
}
POST /_analyze
{
"text":"中华民族共和国国歌",
"analyzer":"ik_max_word"
}
{
"tokens" : [
{
"token" : "中华民族",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "中华",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "民族",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "共和国",
"start_offset" : 4,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "共和",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "国",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 5
},
{
"token" : "国歌",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 6
}
]
}
扩展词和关键词
- 扩展词:就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典
- 停用词:就是有些关键词,我们并不想让他被检索到,可以放入停用词典中
设置扩展词典和停用词典在es容器中的
config/analysis-ik
目录下的
IKAnalyzer.cfg.xml
中
1. 修改vim IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
2. 在es容器中`config/analysis-ik`目录下中创建ext_dict.dic文件 编码一定要为UTF-8才能生效
vim ext_dict.dic 加入扩展词即可
3. 在es容器中`config/analysis-ik`目录中创建ext_stopword.dic文件
vim ext_stopword.dic 加入停用词即可
4.重启es生效
es本身也提供了一些常用的扩展词典和停用词典可以直接使用
版权归原作者 NeverOW 所有, 如有侵权,请联系我们删除。