Elasticsearch实践(四):IK分词
环境:Elasticsearch 6.2.4 + Kibana 6.2.4 + ik 6.2.4
Elasticsearch默认也能对中文进行分词。
我们先来看看自带的中文分词效果:
curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json;' -d '{"analyzer": "default","text": "今天天气真好"}'
GET /_analyze
{"analyzer": "default","text": "今天天气真好"
}
结果:
{"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},{"token": "真","start_offset": 4,"end_offset": 5,"type": "<IDEOGRAPHIC>","position": 4},{"token": "好","start_offset": 5,"end_offset": 6,"type": "<IDEOGRAPHIC>","position": 5}]
}
我们发现,是按照每个字进行分词的。这种在实际应用里肯定达不到想要的效果。当然,如果是日志搜索,使用自带的就足够了。
analyzer=default
其实调用的是standard
分词器。
接下来,我们安装IK分词插件进行分词。
安装IK
IK项目地址:https://github.com/medcl/elasticsearch-analysis-ik
首先需要说明的是,IK插件必须和 ElasticSearch 的版本一致,否则不兼容。
安装方法1:
从 https://github.com/medcl/elasticsearch-analysis-ik/releases 下载压缩包,然后在ES的plugins
目录创建analysis-ik
子目录,把压缩包的内容复制到这个目录里面即可。最终plugins/analysis-ik/
目录里面的内容:
plugins/analysis-ik/commons-codec-1.9.jarcommons-logging-1.2.jarelasticsearch-analysis-ik-6.2.4.jarhttpclient-4.5.2.jarhttpcore-4.4.4.jarplugin-descriptor.properties
然后重启 ElasticSearch。
安装方法2:
./usr/local/elk/elasticsearch-6.2.4/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip
如果已下载压缩包,直接使用:
./usr/local/elk/elasticsearch-6.2.4/bin/elasticsearch-plugin install file:///tmp/elasticsearch-analysis-ik-6.2.4.zip
然后重启 ElasticSearch。
IK分词
IK支持两种分词模式:
- ik_max_word: 会将文本做最细粒度的拆分,会穷尽各种可能的组合
- ik_smart: 会做最粗粒度的拆分
接下来,我们测算IK分词效果和自带的有什么不同:
curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "ik_smart","text": "今天天气真好"}'
结果:
{"tokens": [{"token": "今天天气","start_offset": 0,"end_offset": 4,"type": "CN_WORD","position": 0},{"token": "真好","start_offset": 4,"end_offset": 6,"type": "CN_WORD","position": 1}]
}
再试一下ik_max_word
的效果:
{"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": 1,"end_offset": 3,"type": "CN_WORD","position": 2},{"token": "天气","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 3},{"token": "真好","start_offset": 4,"end_offset": 6,"type": "CN_WORD","position": 4}]
}
设置mapping默认分词器
示例:
{"properties": {"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}
}
注:这里设置 search_analyzer
与 analyzer
相同是为了确保搜索时和索引时使用相同的分词器,以确保查询中的术语与反向索引中的术语具有相同的格式。如果不设置 search_analyzer
,则 search_analyzer
与 analyzer
相同。详细请查阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html
防盗版声明:本文系原创文章,发布于公众号飞鸿影的博客
(fhyblog)及博客园,转载需作者同意。
自定义分词词典
我们也可以定义自己的词典供IK使用。比如:
curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "ik_smart","text": "去朝阳公园"}'
结果:
{"tokens": [{"token": "去","start_offset": 0,"end_offset": 1,"type": "CN_CHAR","position": 0},{"token": "朝阳","start_offset": 1,"end_offset": 3,"type": "CN_WORD","position": 1},{"token": "公园","start_offset": 3,"end_offset": 5,"type": "CN_WORD","position": 2}]
}
我们希望朝阳公园
作为一个整体,这时候可以把该词加入到自己的词典里。
新建自己的词典只需要简单几步就可以完成:
1、在elasticsearch-6.2.4/config/analysis-ik/
目录增加一个my.dic
:
$ touch my.dic
$ echo 朝阳公园 > my.dic$ cat my.dic
朝阳公园
.dic
为词典文件,其实就是简单的文本文件,词语与词语直接需要换行。注意是UTF8编码。我们看一下自带的分词文件:
$ head -n 5 main.dic
一一列举
一一对应
一一道来
一丁
一丁不识
2、然后修改elasticsearch-6.2.4/config/analysis-ik/IKAnalyzer.cfg.xml
文件:
<?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">my.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
增加了my.dic
,然后重启ES。我们再看一下效果:
GET /_analyze
{"analyzer": "ik_smart","text": "去朝阳公园"
}
结果:
{"tokens": [{"token": "去","start_offset": 0,"end_offset": 1,"type": "CN_CHAR","position": 0},{"token": "朝阳公园","start_offset": 1,"end_offset": 5,"type": "CN_WORD","position": 1}]
}
说明自定义词典生效了。如果有多个词典,使用英文分号隔开:
<entry key="ext_dict">my.dic;custom/single_word_low_freq.dic</entry>
另外,我们看到配置里还有个扩展停止词字典
,这个是用来辅助断句的。我们可以看一下自带的一个扩展停止词字典
:
$ head -n 5 extra_stopword.dic
也
了
仍
从
以
也就是IK分词器遇到这些词就认为前面的词语不会与这些词构成词语。
IK分词也支持远程词典,远程词典的好处是支持热更新。词典格式和本地的一致,都是一行一个分词(换行符用 \n
),还要求填写的URL满足:
该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
详见:https://github.com/medcl/elasticsearch-analysis-ik 热更新 IK 分词使用方法 部分。
注意:上面的示例里我们改的是`
elasticsearch-6.2.4/config/analysis-ik/
目录下内容,是因为IK是通过方法2里elasticsearch-plugin
安装的。如果你是通过解压方式安装的,那么IK配置会在plugins目录,即:elasticsearch-6.2.4/plugins/analysis-ik/config
。也就是说插件的配置既可以放在插件所在目录,也可以放在Elasticsearch的config目录里面。
ES内置的Analyzer分析器
es自带了许多内置的Analyzer分析器,无需配置就可以直接在index中使用:
- 标准分词器(standard):以单词边界切分字符串为terms,根据Unicode文本分割算法。它会移除大部分的标点符号,小写分词后的term,支持停用词。
- 简单分词器(simple):该分词器会在遇到非字母时切分字符串,小写所有的term。
- 空格分词器(whitespace):遇到空格字符时切分字符串,
- 停用词分词器(stop):类似简单分词器,同时支持移除停用词。
- 关键词分词器(keyword):无操作分词器,会输出与输入相同的内容作为一个single term。
- 模式分词器(pattern):使用正则表达式讲字符串且分为terms。支持小写字母和停用词。
- 语言分词器(language):支持许多基于特定语言的分词器,比如english或french。
- 签名分词器(fingerprint):是一个专家分词器,会产生一个签名,可以用于去重检测。
- 自定义分词器:如果内置分词器无法满足你的需求,可以自定义custom分词器,根据不同的character filters,tokenizer,token filters的组合 。例如IK就是自定义分词器。
详见文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html
参考
1、medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.
https://github.com/medcl/elasticsearch-analysis-ik
2、ElesticSearch IK中文分词使用详解 - xsdxs的博客 - CSDN博客
https://blog.csdn.net/xsdxs/article/details/72853288
转载于:https://www.cnblogs.com/52fhy/p/10046823.html
Elasticsearch实践(四):IK分词相关推荐
- Elasticsearch中安装IK分词器
Elasticsearch中默认的分词器对中文的支持不好,会分隔成一个一个的汉字.而IK分词器对中文的支持比较好一些,主要有两种模式"ik_smart"和"ik_max_ ...
- ElasticSearch用法和IK分词器
ElasticSearch用法和IK分词器 ElasticSearch 是什么? 为什么选择ES? ES提供的能力 ES常用使用场景 ES架构 ES 基本概念 ES 数据类型 ElasticSearc ...
- 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程
docker安装配置elasticsearch,kibana和IK分词器 elasticsearch文章系列 前置安装docker 创建docker网络 安装Elasticsearch 运行elast ...
- Elasticsearch下安装ik分词器
安装ik分词器(必须安装maven) 上传相应jar包 解压到相应目录 unzip elasticsearch-analysis-ik-master.zip(zip包) cp -r elasticse ...
- 【Elasticsearch】es IK分词器的安装
1.概述 [Elasticsearch]es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么 之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字 ...
- window10下安装Elasticsearch(es)和IK分词器
1 安装Elasticsearch 7.x 1.1 下载地址 https://www.elastic.co/cn/downloads/elasticsearch 1.2 下载后解压的目录结构 Ela ...
- Elasticsearch插件管理(ik分词器、附件文本抽取插件)
倒排索引 Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索.见其名,知其意,有倒排索引,肯定会对应有正向索引.正向索引(forward index),反向索引(inver ...
- ElasticSearch学习:ik分词器
IK分词器是关于中文的一个分词器,有IK分词器自然还有别的分词器,比如说pinyin分词器针对的是拼音分词,letter针对的是letter分词等,ES有一个很好的方式就是通过插件的形式来扩展这些功能 ...
- Elasticsearch拼音和ik分词器的结合应用
一.创建索引时,自定义拼音分词和ik分词 PUT /my_index {"index": {"analysis": {"analyzer": ...
- ElasticSearch——IK分词器的下载及使用
ElasticSearch--IK分词器的下载及使用 1.什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器 分词方式 StandardAnalyzer 单字分词 CJKAna ...
最新文章
- npm包开发测试与发布
- 只用静态图像,就能实时渲染出丝滑3D效果 | CVPR 2021 Oral
- 逻辑电路 - 与非门Nand Gate
- WebView的截屏实现
- Python Dict用法
- ios键盘横屏_cocos2d 3.2版本IOS因键盘引起横竖屏问题
- 大数据技术hadoop入门级生态圈介绍
- thinkPHP5.0表单令牌使用
- 6月26号.NET面试题(程序题部分)只要做懂这3道题肯定能脱离菜鸟称号!
- 使用detours实现劫持
- oracle函数 NLS_INITCAP(x[,y])
- php创建游戏房间思路,php设计模式之建造器模式分析【星际争霸游戏案例】
- php商城教学视频教程,布尔教育ThinkPHP商城实战视频教程的课件源码分享
- 小波分析 瞬态信号 matlab,小波变换在瞬态信号波至点检测中的应用研究
- [手机分享]黑莓手机7系列分享之——黑莓7290
- 2022-2027年中国股权众筹行业市场调研及未来发展趋势预测报告
- React Native 实践之携程 Moles 框架
- stackoverflow热门问题(二)- 如何确定C的数组的大小
- 像扫二维码一样的快速录入银行卡信息
- Windows 和 Linux 系统查询 IP 地址命令
热门文章
- 从零实现循环神经网络
- 灵活地横向扩展:从文件系统到分布式文件系统
- 冬日暖阳,侯捷畅谈技术人生与读书感悟
- 电子工业出版社博文视点图书在微软VS2010全球发布会上受追捧
- matplotlib绘图进阶
- linux查看谷歌服务,如何查询Linux服务的作用
- python的invalid syntax是什么意思_python中出现invalid syntax报错的几种原因
- php手术多久就不疼了,自己腹部刚开刀口没几天,却站了5小时为患者手术
- Android SQLiteDatabase.query()各个参数的意义
- 7-9 龟兔赛跑 (20 分)