1. 概述
分词器是Elasticsearch中很重要的一个组件,用来将一段文本分析成一个一个的词,Elasticsearch再根据这些词去做倒排索引。
今天我们就来聊聊分词器的相关知识。
2. 内置分词器
2.1 概述
Elasticsearch 中内置了一些分词器,这些分词器只能对英文进行分词处理,无法将中文的词识别出来。
2.2 内置分词器介绍
standard:标准分词器,是Elasticsearch中默认的分词器,可以拆分英文单词,大写字母统一转换成小写。
simple:按非字母的字符分词,例如:数字、标点符号、特殊字符等,会去掉非字母的词,大写字母统一转换成小写。
whitespace:简单按照空格进行分词,相当于按照空格split了一下,大写字母不会转换成小写。
stop:会去掉无意义的词,例如:the、a、an 等,大写字母统一转换成小写。
keyword:不拆分,整个文本当作一个词。
2.3 查看分词效果通用接口
GET http://192.168.1.11:9200/_analyze
参数:
{ "analyzer": "standard", "text": "I am a man." }
响应:
{ "tokens": [ { "token": "i", "start_offset": 0, "end_offset": 1, "type": "<ALPHANUM>", "position": 0 }, { "token": "am", "start_offset": 2, "end_offset": 4, "type": "<ALPHANUM>", "position": 1 }, { "token": "a", "start_offset": 5, "end_offset": 6, "type": "<ALPHANUM>", "position": 2 }, { "token": "man", "start_offset": 7, "end_offset": 10, "type": "<ALPHANUM>", "position": 3 } ] }
3. IK分词器
3.1 概述
Elasticsearch中内置的分词器不能对中文进行分词,因此我们需要再安装一个能够支持中文的分词器,IK分词器就是个不错的选择。
3.2 下载IK分词器
下载网址:https://github.com/medcl/elasticsearch-analysis-ik
3.3 IK分词器的安装
1)为IK分词器创建目录
# cd /usr/local/elasticsearch-7.14.1/plugins
# mkdir ik
2)将IK分词器压缩包拷贝到CentOS7的目录下,例如:/home
3)将压缩包解压到刚刚创建的目录
# unzip elasticsearch-analysis-ik-7.14.1.zip -d /usr/local/elasticsearch-7.14.1/plugins/ik/
4)重启Elasticsearch
3.4 IK分词器介绍
ik_max_word: 会将文本做最细粒度的拆分,适合 Term Query;
ik_smart: 会做最粗粒度的拆分,适合 Phrase 查询。
IK分词器介绍来源于GitHub:https://github.com/medcl/elasticsearch-analysis-ik
3.5 分词效果
GET http://192.168.1.11:9200/_analyze
参数:
{ "analyzer": "ik_max_word", "text": "我是一名Java高级程序员" }
响应:
{ "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "一名", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 2 }, { "token": "一", "start_offset": 2, "end_offset": 3, "type": "TYPE_CNUM", "position": 3 }, { "token": "名", "start_offset": 3, "end_offset": 4, "type": "COUNT", "position": 4 }, { "token": "java", "start_offset": 4, "end_offset": 8, "type": "ENGLISH", "position": 5 }, { "token": "高级", "start_offset": 8, "end_offset": 10, "type": "CN_WORD", "position": 6 }, { "token": "程序员", "start_offset": 10, "end_offset": 13, "type": "CN_WORD", "position": 7 }, { "token": "程序", "start_offset": 10, "end_offset": 12, "type": "CN_WORD", "position": 8 }, { "token": "员", "start_offset": 12, "end_offset": 13, "type": "CN_CHAR", "position": 9 } ] }
4. 自定义词库
4.1 概述
在进行中文分词时,经常出现分析出的词不是我们想要的,这时我们就需要在IK分词器中自定义我们自己词库。
例如:追风人,分词后,只有 追风 和 人,而没有 追风人,导致倒排索引后查询时,用户搜 追风 或 人 可以搜到 追风人,搜 追风人 反而搜不到 追风人。
4.2 自定义词库
# cd /usr/local/elasticsearch-7.14.1/plugins/ik/config
# vi IKAnalyzer.cfg.xml
在配置文件中增加自己的字典
# vi my.dic
在文本中加入 追风人,保存。
重启Elasticsearch即可。
5. 综述
今天简单聊了一下 Elasticsearch(ES)分词器的相关知识,希望可以对大家的工作有所帮助。
欢迎大家帮忙点赞、评论、加关注 :)
关注追风人聊Java,每天更新Java干货。