【ES从入门到实战】二十一、全文检索-ElasticSearch-分词-分词&安装ik分词
分词
一个 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即可
本文来自博客园,作者:King-DA,转载请注明原文链接:https://www.cnblogs.com/qingmuchuanqi48/articles/14697912.html

浙公网安备 33010602011771号