1.背景

1.1 简介

ES默认的分词器对中文分词并不友好,所以一般会安装中文分词插件,以便能更好的支持中文分词检索。

1.2 IK分词器

IK分词器在是一款基于词典和规则的中文分词器。这里讲解的IK分词器是独立于Elasticsearch、Lucene、Solr,可以直接用在java代码中的部分。实际工作中IK分词器一般都是集成到Solr和Elasticsearch搜索引擎里面使用。
IK分词采用Java编写。
IK分词的效果主要取决于词库,目前自带主词典拥有27万左右的汉语单词量。对于应用领域的不同,需要各类专业词库的支持。词库还可以自己维护。
IK分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
IK分词器有两种分词模式:ik_max_word和ik_smart。

下载安装包

  1. 下载预编译的安装包,下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
  1. 下载对应版本,IK版本与Elasticsearch版本一致
  1. 将IK包加入到Elasticsearch插件目录下,新建ik目录,参考如下:

1.3 分词模式

IK分词器有两种分词模式:
  1. 细粒度模式 ik_max_word
  1. 智能模式 ik_smart

细粒度模式

采用细粒度模式ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合。测试代码:
 GET /_analyze
{
"text": ["中华人民共和国国歌"],
"analyzer": "ik_max_word"
}

分词规则

  1. 当查询词在词典中不存在时,会按字拆分。如:在风->在,风
  1. 当查询词在词典中存在,且长度为两个字时,有时拆分有时不拆分。例如:甲乙–>甲乙 , 联通–>联通,联,通
  1. 当查询词在词典中存在,且查询词的一部分也在词典在中存在,则分别拆分。例如:甲乙丙丁–>甲乙丙丁,甲乙,丙丁 中国联通–>中国联通,中国,国联,联通,通
  1. 当查询词任意部分都不在词典中存储,则按字拆分

智能模式

智能模式ik_smart会做最粗粒度的拆分。比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
 GET /_analyze
{
"text": ["中华人民共和国国歌"],
"analyzer": "ik_smart"
}

分词规则

  1. 当查询词在词典中不存在时,会按字拆分 例如:在北–>在,北
  1. 当查询词在词典中存在,不做拆分 例如:甲乙–>甲乙,甲乙丙丁–>甲乙丙丁
  1. 当查询词任意部分都不在词典中存储,则按字拆分

2.分词实践

2.1 词典配置

很多时候默认的分词效果达不到线上使用的要求,这就需要不断维护扩展词典和停止词字典,提高分词匹配的准确性,优化用户体验。
在IK分词器中,主要可以维护2种词典,一种是扩展词典,可以自定义一些词语,提高分词精读。
另一种是停止词词典,停止词就是指不会被分词拆分出来的词语,不参与分词和检索操作。
可以通过修改IKAnalyzer.cfg.xml配置文件,来自定义词典。IKAnalyzer.cfg.xml的位置为{plugins}/ik/config/。

注意事项

  1. ext_dict:直接修改ext_dict属性中配置的字段里面的内容,并不能立刻生效。只有重启ES进程实例,修改的内容才会生效。
  1. remote_ext_dict:通过远程扩展的字典,可以实现词典的热更新,不用重启ES进程实例。

2.2 词典热更新

配置词典代理

配置词典源有多种模式,如tomact容器,Nginx代理等,本例基于Nginx配置代理如下:
Nginx按照参考:《Nginx按照教程》
 server {
listen 8084;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /ik-remote-dic {
alias /opt/elasticsearch/ik-config;
autoindex on;
}
........

设置词典值

在目录下设置数据词典(本例为: /opt/elasticsearch/ik-config),由于是中文分词,特别注意文件的字符格式(UTF-8),参考如下:

配置远程词典源

2.3 分词应用

关键词查询,未做扩展的数据字典:
 GET /_analyze
{
"text": "成都数康公司,通商速子股份有限公司,字节不跳动公司,头颅后侧位工时,王令",
"analyzer": "ik_smart"
}
关键词查询,做扩展的数据字典:
 GET /_analyze
{
"text": "重庆数康公司,通商数字股份有限公司,字节跳动公司,头颅正侧位工时,王令,王玲的报告,测试是报告",
"analyzer": "ik_smart"
}

 

ELK技术-IK-中文分词器的更多相关文章

  1. Solr学习笔记之2、集成IK中文分词器

    Solr学习笔记之2.集成IK中文分词器 一.下载IK中文分词器 IK中文分词器 此文IK版本:IK Analyer 2012-FF hotfix 1 完整分发包 二.在Solr中集成IK中文分词器 ...

  2. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  3. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器

    注: elasticsearch 版本6.2.2 1)集群模式,则每个节点都需要安装ik分词,安装插件完毕后需要重启服务,创建mapping前如果有机器未安装分词,则可能该索引可能为RED,需要删除后 ...

  4. es5.0 安装ik中文分词器 mac

    es5.0集成ik中文分词器,网上资料很多,但是讲的有点乱,有的方法甚至不能正常运行此插件 特别注意的而是,es的版本一定要和ik插件的版本相对应: 1,下载ik 插件: https://github ...

  5. elasticsearch ik中文分词器安装

    特殊说明:灰色文字用来辅助理解的. 安装IK中文分词器 我在百度上搜索了下,大多介绍的都是用maven打包下载下来的源码,这种方法也行,但是不够方便,为什么这么说? 首先需要安装maven吧?其次需要 ...

  6. ElasticSearch速学 - IK中文分词器远程字典设置

    前面已经对”IK中文分词器“有了简单的了解:  但是可以发现不是对所有的词都能很好的区分,比如:  逼格这个词就没有分出来. 词库 实际上IK分词器也是根据一些词库来进行分词的,我们可以丰富这个词库. ...

  7. 搜索引擎ElasticSearch系列(五): ElasticSearch2.4.4 IK中文分词器插件安装

    一:IK分词器简介  IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源 ...

  8. ES-Mac OS环境搭建-ik中文分词器

    下载 从github下载ik中文分词器,点击地址,需要注意的是,ik分词器和elasticsearch版本必须一致. 安装 下载到本地并解压到elasticsearch中的plugins目录内即可. ...

  9. 30.IK中文分词器的安装和简单使用

    在之前我们学的都是英文,用的也是英文的standard分词器.从这一节开始,学习中文分词器.中国人基本上都是中文应用,很少是英文的,而standard分词器是没有办法对中文进行合理分词的,只是将每个中 ...

  10. Solr7.2.1环境搭建和配置ik中文分词器

    solr7.2.1环境搭建和配置ik中文分词器 安装环境:Jdk 1.8. windows 10 安装包准备: solr 各种版本集合下载:http://archive.apache.org/dist ...

随机推荐

  1. 编程技巧│浏览器 Notification 桌面推送通知

    目录 一.什么是 Notification 二.弹窗授权 三.弹窗使用 四.浏览器支持检测 五.授权回调 六.3秒后关闭弹窗 一.什么是 Notification Notification 是浏览器最 ...

  2. spring源码解析:元注解功能的实现

    前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...

  3. jdbc连接数据库问题

    ### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Fail ...

  4. go统计字符串及数组中出现次数

    数组:统计出现字数 package main import "fmt" func main() { s := [...]string{"Mlxg", " ...

  5. Feign通过自定义注解实现路径的转义

    本文主要讲解如果通过注解实现对路由中的路径进行自定义编码 背景 近期由于项目中需要,所以需要通过Feign封装一个对Harbor操作的sdk信息. 在调用的过程中发现,当请求参数中带有"/& ...

  6. Python教程:随机验证码生成和join 字符串

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  7. String长度限制?

    String我们在开发和学习中会经常用到,但对String类型的取值范围我们并不明确. String底层是char数组,并未标明长度限制.java中可以对数组指定长度,如果不指定就以实际元素来指定 p ...

  8. 【docker专栏4】使用docker安装nginx提供web服务

    一般学习一项技术,会先用一个最简单的例子或最典型的例子来向大家讲解入门内容,所以此文为大家介绍使用docker安装nginx容器服务.从基础使用的角度来讲,此文几乎涵盖了docker最核心的内容:镜像 ...

  9. Java编程作业

    1.编程题 设计一个用户类User,类中的变量有用户名.密码和记录用户数量的变量,定义3个构造方法:无参的.为用户名赋值的.为用户名和密码赋值的,还有获取和设置密码的方法和返回类信息的方法. pack ...

  10. 2022.7.19 $\mathcal{S\,\,T\,L}$

    \(STL\) 容器的共有特征:.begin() .end()//表示最后一个元素的后面那个位置 .size()//无符号整型 .swap(b) ::iterator//迭代器 关于迭代器 迭代器可以 ...