分词
一个 tokenizer
(分词器)接收一个字符流
,将之分割为独立的 tokens
(词元,通常是独立的单词),然后输出 tokens
流。
例如, whitespace tokenizer
遇到空白字符时分割文本。它会将文本"Quick brown fox!"分割为[Quick
, brown
, fox!
l。
该 tokenizer
(分词器)还负责记录各个 term
(词条)的顺序或 position
位置(用于 phrase
短语和 word proximity
词近邻查询) ,以及 term
(词条)所代表的原始 word
(单词)的 start
(起始)和 end
(结束)的 character offsets
(字符偏移量) (用于高亮显示搜索的内容)。
Elasticsearch
提供了很多内置的分词器,可以用来构建 custom analyzers (自定义分词器) 。
测试 ES 默认的标准分词器:英文
:
POST _analyze { "analyzer": "standard", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
中文
:
POST _analyze { "analyzer": "standard", "text": "pafcmall电商项目" }
1)、安装 ik 分词器
注意
:不能用默认 elasticsearch-plugin install xxx.zip 进行自动安装
进入 https://github.com/medcl/elasticsearch-analysis-ik/releases
找到对应的 es 版本安装
1、进入 es 容器内部 plugins 目录
docker exec -it 容器id /bin/bash wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
2、安装 wget
:
yum install wget
3、下载和 ES 匹配版本的 ik
分词器:
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
4、unzip
下载文件并解压
1)、使用 unzip
解压 elasticsearch-analysis-ik-7.4.2.zip
发现 unzip
命令还未安装,先安装 unzip
2)、解压文件到 plugins
目录下的 ik
目录
3)删除压缩包,并给 ik
目录及其文件授权
rm -rf *.zip
chmod -R 777 ik/
5、可以确认是否安装好了分词器
cd../bin
elasticsearch plugin list:即可列出系统的分词器
1)、进入docker中的es容器内
2)、列出系统的分词器
6、重启 ES 使 ik 分词器生效
docker restart elasticsearch
2)、测试分词器
使用默认分词
:POST _analyze { "analyzer": "standard", "text": "pafcmall电商项目" }
结果:
ik智能分词
:-
POST _analyze { "analyzer": "ik_smart", "text": "pafcmall电商项目" }
结果:
POST _analyze { "analyzer": "ik_smart", "text": "我是中国人" }
结果:
ik_max_word分词
:
POST _analyze { "analyzer": "ik_max_word", "text": "我是中国人" }
结果:
够看出不同的分词器,分词有明显的区别,所以以后定义一个索引不能再使用默认的 mapping 了,要手工建立 mapping,因为要选择分词器。
分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,
默认的中文分词是将每个字看成一个词,比如"中国的花"会被分为"中","国","的","花",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
IK提供了两个分词算法
ik_smart 和 ik_max_word
其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
我们分别来试一下 (1)最小切分:在浏览器地址栏输入地址 http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员 输出的结果为: "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" : 5, "type" : "CN_WORD", "position" : 2 } ] } (2)最细切分:在浏览器地址栏输入地址 http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员 输出的结果为: { "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" : 5, "type" : "CN_WORD", "position" : 2 }, { "token" : "程序", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 3 }, { "token" : "员", "start_offset" : 4, "end_offset" : 5, "type" : "CN_CHAR", "position" : 4 } ] }
ik分词器支持自定义词库
默认的分词并没有识别“小明”是一个词。如果我们想让系统识别“小明”是一个词,需要编辑自定义词库。
步骤:
(1)进入elasticsearch/plugins/ik/config目录
(2)新建一个my.dic文件,编辑内容:
小明
修改IKAnalyzer.cfg.xml(在ik/config目录下)
<properties> <comment>IK Analyzer 扩展配置</comment> <!‐‐用户可以在这里配置自己的扩展字典 ‐‐> <entry key="ext_dict">my.dic</entry> <!‐‐用户可以在这里配置自己的扩展停止词字典‐‐> <entry key="ext_stopwords"></entry> </properties>
重新启动elasticsearch即可