Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >elasticsearch安装ik中文分词器

elasticsearch安装ik中文分词器

作者头像
py3study
发布于 2021-04-25 07:48:01
发布于 2021-04-25 07:48:01
1.2K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

elasticsearch官方默认的分词插件,对中文分词效果不理想。

中文的分词器现在大家比较推荐的就是 IK分词器,当然也有些其它的比如 smartCN、HanLP。

这里只讲如何使用IK做为中文分词。

二、安装elasticsearch

环境说明

操作系统:centos 7.6

docker版本:19.03.12

ip地址:192.168.31.165

安装

这里安装7.10.1版本

下载镜像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull elasticsearch:7.5.1

修改系统参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi /etc/sysctl.conf

调整参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vm.max_map_count=262144

刷新参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sysctl -p

注意,系统参数一定要修改,否则参数过低,会造成elasticsearch启动失败。

配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /data/elk7/elasticsearch/{data,logs,config,plugins}
vi /data/elk7/elasticsearch/config/elasticsearch.yml

内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cluster.name: "docker-cluster"
network.host: 0.0.0.0

启动elasticsearch

以单例模式启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d --name=elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" elasticsearch:7.10.1

等待30秒左右,查看docker日志,是否有错误日志

访问elasticsearch页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.31.165:9200/

效果如下:

拷贝数据到持久化目录,并重新启动elasticsearch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker cp elasticsearch:/usr/share/elasticsearch/data /data/elk7/elasticsearch/
docker cp elasticsearch:/usr/share/elasticsearch/logs /data/elk7/elasticsearch/
chmod 777 -R /data/elk7/elasticsearch/

docker rm -f elasticsearch
docker run -d --name=elasticsearch \
  --restart=always \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -v /data/elk7/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /data/elk7/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /data/elk7/elasticsearch/logs:/usr/share/elasticsearch/logs \
  elasticsearch:7.10.1

再次刷新页面,效果同上。

三、安装ik中文分词器

打开github地址:https://github.com/medcl/elasticsearch-analysis-ik

打开releases页面,下载7.10.1版本

注意:这个版本,必须和elasticsearch对应。

下载完成后,将文件elasticsearch-analysis-ik-7.10.1.zip上传到/opt目录

解压到指定目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir /data/elk7/elasticsearch/plugins/elasticsearch-analysis-ik
unzip /opt/elasticsearch-analysis-ik-7.10.1.zip -d /data/elk7/elasticsearch/plugins/elasticsearch-analysis-ik

设置文件权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chmod 777 -R /data/elk7/elasticsearch/

重新启动elasticsearch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker rm -f elasticsearch
docker run -d --name=elasticsearch \
  --restart=always \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -v /data/elk7/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /data/elk7/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /data/elk7/elasticsearch/logs:/usr/share/elasticsearch/logs \
  -v /data/elk7/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
  elasticsearch:7.10.1

注意:这里是新挂载了plugins目录,用来存放插件的。

查看插件接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.31.165:9200/_cat/plugins

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
e30bb0e85e63 analysis-ik 7.10.1

说明插件安装成功了。

四、ik分词器的使用

简单示例

请求url:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.31.165:9200/_analyze

首先我们通过Postman发送GET请求查询分词效果

先指定Headers,Content-Type=application/json

再指定请求参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "text":"农业银行"
}

效果如下:

得到如下结果,可以发现es的默认分词器无法识别中文中农业银行这样的词汇,而是简单的将每个字拆完分为一个词,这显然不符合我们的使用要求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "tokens": [
        {
            "token": "农",
            "start_offset": 0,
            "end_offset": 1,
            "type": "<IDEOGRAPHIC>",
            "position": 0
        },
        {
            "token": "业",
            "start_offset": 1,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 1
        },
        {
            "token": "银",
            "start_offset": 2,
            "end_offset": 3,
            "type": "<IDEOGRAPHIC>",
            "position": 2
        },
        {
            "token": "行",
            "start_offset": 3,
            "end_offset": 4,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        }
    ]
}

上面已经安装ik中文分词器,接下来使用它。

我们这次加入新的参数"analyzer":"ik_max_word"

  • k_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合
  • ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」

修改postman请求参数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "analyzer":"ik_max_word",
    "text":"农业银行"
}

得到如下结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "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
        }
    ]
}

百度搜索中每天都会收录新的词汇,es中也可以进行扩展词汇。

我们首先查询弗雷尔卓德字段

修改postman请求参数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "analyzer":"ik_max_word",
    "text":"弗雷尔卓德"
}

仅仅可以得到每个字的分词结果,我们需要做的就是使分词器识别到弗雷尔卓德也是一个词语。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "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": 3,
            "type": "CN_CHAR",
            "position": 2
        },
        {
            "token": "卓",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "德",
            "start_offset": 4,
            "end_offset": 5,
            "type": "CN_CHAR",
            "position": 4
        }
    ]
}

首先进入es根目录中的plugins文件夹下的ik文件夹,进入config目录,创建custom.dic文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /data/elk7/elasticsearch/plugins/elasticsearch-analysis-ik/config
vi custom.dic

写入以下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
弗雷尔卓德
弗雷尔
卓
德

打开IKAnalyzer.cfg.xml文件,将新建的custom.dic配置其中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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">custom.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

注意:仅仅修改<entry key="ext_dict"></entry> 这一行内容即可

重启es

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker restart elasticsearch

再次查询发现es的分词器可以识别到弗雷尔卓德词汇

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "tokens": [
        {
            "token": "弗雷尔卓德",
            "start_offset": 0,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "弗雷尔",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "卓",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "德",
            "start_offset": 4,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 3
        }
    ]
}

官方示例

1. 创建索引

进入linux系统,手动执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPUT http://localhost:9200/index

 2.创建一个映射

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPOST http://localhost:9200/index/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
        }

}'

3. 索引加入一些文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPOST http://localhost:9200/index/_create/1 -H 'Content-Type:application/json' -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
curl -XPOST http://localhost:9200/index/_create/2 -H 'Content-Type:application/json' -d'
{"content":"公安部:各地校车将享最高路权"}
'
curl -XPOST http://localhost:9200/index/_create/3 -H 'Content-Type:application/json' -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
'
curl -XPOST http://localhost:9200/index/_create/4 -H 'Content-Type:application/json' -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'

4. 带高亮显示的查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPOST http://localhost:9200/index/_search  -H 'Content-Type:application/json' -d'
{
    "query" : { "match" : { "content" : "中国" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}
'

注意:

highlight表示高亮显示。

pre_tags,post_tags表示,匹配关键字后,增加标记。

fields 表示

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "took": 174,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.2257079,
        "hits": [
            {
                "_index": "index",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.2257079,
                "_source": {
                    "content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
                },
                "highlight": {
                    "content": [
                        "<tag1>中</tag1>韩渔警冲突调查:韩警平均每天扣1艘<tag1>中</tag1><tag1>国</tag1>渔船"
                    ]
                }
            },
            {
                "_index": "index",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.9640833,
                "_source": {
                    "content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
                },
                "highlight": {
                    "content": [
                        "<tag1>中</tag1><tag1>国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
                    ]
                }
            },
            {
                "_index": "index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.3864615,
                "_source": {
                    "content": "美国留给伊拉克的是个烂摊子吗"
                },
                "highlight": {
                    "content": [
                        "美<tag1>国</tag1>留给伊拉克的是个烂摊子吗"
                    ]
                }
            }
        ]
    }
}

字典配置

上午已经提到了如何自定义字典文件,比如:custom.dic。这里不做重复介绍,请查看上文操作。

热更新 IK 分词使用方法

目前该插件支持热更新 IK 分词,通过上文在 IK 配置文件中提到的如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">location</entry>

其中 location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。

  1. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
  2. 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。

注意:远程扩展字典,需要自己写api,根据实际业务情况而定。我目前还未找到公开的远程扩展字典api,支持任何用户访问的那种。

本文参考链接:

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

https://www.cnblogs.com/haixiang/p/11810799.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
docker下,一行命令搭建elasticsearch6.5.0集群(带head插件和ik分词器)
搭建一个elasticsearch6.5.0集群环境,再把elasticsearch-head插件和ik分词器装好,在docker环境下完成这些工作需要多久? 答案是:只需下面这一行命令:
程序员欣宸
2019/05/29
1.1K0
docker下,一行命令搭建elasticsearch6.5.0集群(带head插件和ik分词器)
Elasticsearch之中文分词器插件es-ik(博主推荐)
  比如,我现在,拿个具体实例来展现下,验证为什么,es官网提供的分词插件对中文分词而言,效果差。
双面人
2019/04/10
1.3K0
Elasticsearch之中文分词器插件es-ik(博主推荐)
Elasticsearch下安装IK中文分词器
环境:elasticsearch版本是5.5.2,其所在目录为/usr/local/elasticsearch-5.5.2
Stanley Sun
2019/09/23
5730
ElasticSearch中文分词器-IK分词器的使用
得到如下结果,可以发现es的默认分词器无法识别中文中农业、银行这样的词汇,而是简单的将每个字拆完分为一个词,这显然不符合我们的使用要求。
海向
2019/11/08
1.6K0
如何在Elasticsearch中安装中文分词器(IK+pinyin)
如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组。 这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题。 本篇文章按照下面的内容进行描述: 分词器的作用 安装IK 简单的测试 模拟测试 安装elasticsearch-analysis-pinyin
用户1154259
2018/01/17
1.9K0
史上最详细Docker安装Elasticsearch、ik分词器、可视化工具,每一步都带有步骤图!!!
删除镜像命令:docker rmi <镜像名:版本号> or docker rmi <镜像id>
宁在春
2022/10/31
1.2K0
史上最详细Docker安装Elasticsearch、ik分词器、可视化工具,每一步都带有步骤图!!!
【elasticsearch】docker下elasticsearch 安装ik分词器
第一种方法: 1)、安装ik分词器 注意:不能用默认elasticsearch-plugin install xxx.zip 进行自动安装 https://github.com/medcl/elas
周杰伦本人
2022/10/25
3.3K0
ik分词器
ik分词器出现的背景: 分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作, 默认的中文分词是将每个字看成一个词,比如"中国的花"会被分为"中","国","的","花",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
名字是乱打的
2022/05/13
3040
Elasticsearch之中文分词器插件es-ik的自定义词库
          如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”。
双面人
2019/04/10
1.5K0
Elasticsearch之中文分词器插件es-ik的自定义词库
自己动手制作elasticsearch的ik分词器的Docker镜像
版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/86668180
程序员欣宸
2019/05/26
2K0
ES中添加 IK 分词器
https://github.com/medcl/elasticsearch-analysis-ik/releases
用户5927264
2019/08/22
1.2K0
elasticsearch6.8 ik分词器需安装
elasticsearch6.8  ik分词器需安装 order_info_es/_analyze POST { "analyzer": "ik_max_word", "text": "湖南省常德市" }
oktokeep
2024/10/09
950
Docker 安装7.12.1版本ElasticSearch、Kibana及中文分词器
好久没有更文,先给广大读者致个歉!最近新找了工作,新工作前面的试用期几乎全力投入工作中去了,另外自己这段时间也在研究一些开源项目,在笔者本为了跑起来花时间填了不少坑,以致于公众号更文的事情被一推再推而被耽误就是一个多月,实在是感觉光阴似箭,虚度不起!下面我们进入正文。
用户3587585
2023/11/01
3K3
Docker 安装7.12.1版本ElasticSearch、Kibana及中文分词器
ES[7.6.x]学习笔记(七)IK中文分词器
在上一节中,我们给大家介绍了ES的分析器,我相信大家对ES的全文搜索已经有了深刻的印象。分析器包含3个部分:字符过滤器、分词器、分词过滤器。在上一节的例子,大家发现了,都是英文的例子,是吧?因为ES是外国人写的嘛,中国如果要在这方面赶上来,还是需要屏幕前的小伙伴们的~
小忽悠
2020/05/07
1.3K0
ES[7.6.x]学习笔记(七)IK中文分词器
018.Elasticsearch分词器原理及使用
默认分词器:按照非字母和非数字字符进行分隔,单词转为小写 测试文本:a*B!c d4e 5f 7-h 分词结果:a、b、c、d4e、5f、7、h
CoderJed
2020/07/06
1.5K0
Docker 通过 Dockfile 安装 elasticsearch 以及 ik ,pinyin 分词
安装 elasticsearch 的 ik 和 pinyin 分词插件,插件的版本要和 elasticsearch 的版本一致
Alone88
2023/10/21
4230
elasticsearch分词器
在IKAnalyzer.cfg.xml目录下新建ext.dic文件,stopword.dic(已存在)
九转成圣
2024/04/10
990
ES 中文分词器ik
参考Es 集群搭建及相关配置和相关参数解读,分别下载Es和kibana 8.2.3版本,部署到相应的服务器,删除es原有的data目录.配置elasticsearch.yml,节点配置如下:
郑小超.
2022/09/21
9660
ES 中文分词器ik
白话Elasticsearch29-IK中文分词之IK分词器配置文件+自定义词库
配置文件位置: ${ES_HOME}/plugins/ik/config/IKAnalyzer.cfg.xml
小小工匠
2021/08/17
1.5K0
Elasticsearch之IKAnalyzer
通过测试结果我们可以发现,使用标准分词器的分词结果,是去掉标点符号,然后一个一个字符来分词,这就是我们上一章提到的中文搜索的问题,这显然不是我们想要的分词效果,接下来我们来看中文分词器。
丁D
2022/08/12
3380
Elasticsearch之IKAnalyzer
推荐阅读
相关推荐
docker下,一行命令搭建elasticsearch6.5.0集群(带head插件和ik分词器)
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验