欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Elasticsearch使用ik分词器

时间:2023-06-19
分析器

什么是分词概念?分析器能使用到哪些场景?

分词意思就是将词语进行分组切片;比如 你好啊 可能就会被分词 为 “你好” 和 “啊”; 在进行搜索时如果根据高亮匹配就会将 “你好” 或者 “啊” 所有匹配的标题内容都匹配出来;

分析器一般就是使用在搜索引擎上;比如百度搜索 mysql时间减7天 就会匹配到 mysql, 时间 , 减 , 7天相匹配的内容;

如下的词条经过不同的分析器会得到不同的词条:

"Set the shape to semi-transparent by calling set_trans(5)"

标准分析器

标准分析器是Elasticsearch默认使用的分析器。它是分析各种语言文本最常用的选择。它根据 Unicode 联盟 定义的 单词边界 划分文本。删除绝大部分标点。最后,将词条小写。它会产生

set, the, shape, to, semi, transparent, by, calling, set_trans, 5

简单分析器

简单分析器在任何不是字母的地方分隔文本,将词条小写。它会产生

set, the, shape, to, semi, transparent, by, calling, set, trans

空格分析器

空格分析器在空格的地方划分文本。它会产生

Set, the, shape, to, semi-transparent, by, calling, set_trans(5)

语言分析器

特定语言分析器可用于 很多语言。它们可以考虑指定语言的特点。例如, 英语 分析器附带了一组英语无用词(常用单词,例如 and 或者 the ,它们对相关性没有多少影响),它们会被删除。 由于理解英语语法的规则,这个分词器可以提取英语单词的 词干

英语 分词器会产生下面的词条:

set, shape, semi, transpar, call, set_tran, 5

注意看 transparent、 calling 和 set_trans 已经变为词根格式。

测试分析器

对 “Text to analyze” 词条进行分析标准分析 会得到 text , to , analyze 三个词;

发送请求

GET http://localhost:9200/_analyze

body

{ "analyzer": "standard", "text": "Text to analyze"}

输出

{ "tokens": [ { "token": "text", "start_offset": 0, "end_offset": 4, "type": "", "position": 0 }, { "token": "to", "start_offset": 5, "end_offset": 7, "type": "", "position": 1 }, { "token": "analyze", "start_offset": 8, "end_offset": 15, "type": "", "position": 2 } ]}

IK中文分词器 安装IK分词器

es默认的标准分析器通常情况下无法满足我们中文使用,除了使用映射的方法,我们一般会安装IK中文分词器插件进行分词;

github:https://github.com/medcl/elasticsearch-analysis-ik

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

一般是下载已经打包好的安装版本,如果下载源码需要自己编译;

选择对应版本的分析器下载,我这边es是 7.8 就下载7.8版本;不同版本es匹配 分析器参考如下

7.8 版本下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0

(无法下载的朋友可以关注gong众号:知识追寻者:回复 es 获取)

windows操作系统下载对应的zip即可;

在plugins 目录下新建ik文件夹将 elasticsearch-analysis-ik-7.8.0.zip 拷贝至es的 plugins 进行解压到ik文件夹里面;重启es 测试ik分词器

在ik分词器中提供了两种分词算法

ik_smart: 最少切分ik_max_word: 最细粒度划分

一般情况下我们使用 ik_smart 即可

发送请求

GET http://localhost:9200/_analyze

body

{ "analyzer": "ik_smart", "text": "钢铁般的意志"}

输出结果

{ "tokens": [ { "token": "钢铁", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 0 }, { "token": "般", "start_offset": 2, "end_offset": 3, "type": "CN_CHAR", "position": 1 }, { "token": "的", "start_offset": 3, "end_offset": 4, "type": "CN_CHAR", "position": 2 }, { "token": "意志", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 3 } ]}

使用ik分词器

首先需要创建索引new ,并且创建映射

PUT localhost:9200/news

body

{ "mappings": { "properties": { "content": { "type": "text", "analyzer": "ik_smart" } } }}

字段 content 类型为text表示可以被分词

为类型_doc添加数据

POST localhost:9200/news/_doc

body

{ "content": "我国灵活就业者已经达到2亿人"}{ "content": "五笔输入法为什么输给拼音输入法"}{ "content": "碳水化合物会导致发胖吗"}

查询匹配结果测试

POST localhost:9200/news/_search

body

{ "query": { "match": { "content": "发胖" } }}

匹配结果

{ "took": 14, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1.0065652, "hits": [ { "_index": "news", "_type": "_doc", "_id": "20Vg4n4B7c1LMGBvNd71", "_score": 1.0065652, "_source": { "content": "碳水化合物会导致发胖吗" } } ] }}

扩展词典

我们现在想要将 “钢铁般的意志” 做为一个词,而不是分割为多个词条,就需要用到扩展词典;

pluginsikconfig 目录下新建文件 my.dic;

在my.dic中写入 钢铁般的意志

在 IKAnalyzer.cfg.xml 中添加扩展词典 my.dic

<?xml version="1.0" encoding="UTF-8"?>IK Analyzer 扩展配置my.dic

请求测试输出结果如下

{ "tokens": [ { "token": "钢铁般的意志", "start_offset": 0, "end_offset": 6, "type": "CN_WORD", "position": 0 } ]}

注: pluginsikconfig 文件说明

IKAnalyzer.cfg.xml:用来配置自定义词库main.dic:ik原生内置的中文词库,总共有27万多条quantifier.dic:些单位相关的词suffix.dic:后缀surname.dic:中国的姓氏stopword.dic:英文停用词

参考文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping-intro.html

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。