为 Elasticsearch 添加中文分词,对比分词器效果
转自:http://keenwon.com/1404.html
为 Elasticsearch 添加中文分词,对比分词器效果
Posted in 后端 By KeenWon On 2014年12月12日 Views:
2,930
Elasticsearch中,内置了很多分词器(analyzers),例如standard
(标准分词器)、english
(英文分词)和chinese
(中文分词)。其中standard
就是无脑的一个一个词(汉字)切分,所以适用范围广,但是精准度低;english
对英文更加智能,可以识别单数负数,大小写,过滤stopwords(例如“the”这个词)等;chinese
效果很差,后面会演示。这次主要玩这几个内容:安装中文分词ik,对比不同分词器的效果,得出一个较佳的配置。关于Elasticsearch,之前还写过两篇文章:Elasticsearch的安装,运行和基本配置 和 备份和恢复,需要的可以看下。
安装中文分词ik
Elasticsearch的中文分词很烂,所以我们需要安装ik。首先从 github上下载项目,解压:
- cd /tmp
- wget https://github.com/medcl/elasticsearch-analysis-ik/archive/master.zip
- unzip master.zip
- cd elasticsearch-analysis-ik/
然后使用mvn package
命令,编译出jar包 elasticsearch-analysis-ik-1.4.0.jar。
- mvn package
将jar包复制到Elasticsearch的plugins/analysis-ik
目录下,再把解压出的ik目录(配置和词典等),复制到Elasticsearch的config
目录下。然后编辑配置文件elasticsearch.yml
,在后面加一行:
- index.analysis.analyzer.ik.type : "ik"
重启service elasticsearch restart
。搞定。
如果上面的mvn搞不定的话,你可以直接从 elasticsearch-rtf 项目中找到编译好的jar包和配置文件(我就是怎么干的)。
【2014-12-14晚更新,今天是星期天,我在vps上安装ik分词,同样的步骤,总是提示MapperParsingException[Analyzer
[ik] not found for field [cn]],然后晚上跑到公司,发现我公司虚拟机上Elasticsearch的版本是1.3.2,vps上是1.3.4,猜是版本问题,直接把vps重新安装成最新的1.4.1,再安装ik,居然ok了……】
准备工作:创建索引,录入测试数据
先为后面的分词器效果对比做好准备,我的Elasticsearch部署在虚拟机 192.168.159.159:9200 上的,使用chrome的postman插件直接发http请求。第一步,创建index1
索引:
- PUT http://192.168.159.159:9200/index1
- {
- "settings": {
- "refresh_interval": "5s",
- "number_of_shards" : 1, // 一个主节点
- "number_of_replicas" : 0 // 0个副本,后面可以加
- },
- "mappings": {
- "_default_":{
- "_all": { "enabled": false } // 关闭_all字段,因为我们只搜索title字段
- },
- "resource": {
- "dynamic": false, // 关闭“动态修改索引”
- "properties": {
- "title": {
- "type": "string",
- "index": "analyzed",
- "fields": {
- "cn": {
- "type": "string",
- "analyzer": "ik"
- },
- "en": {
- "type": "string",
- "analyzer": "english"
- }
- }
- }
- }
- }
- }
- }
为了方便,这里的index1
索引,只有一个shards,没有副本。索引里只有一个叫resource
的type,只有一个字段title
,这就足够我们用了。title
本身使用标准分词器,title.cn
使用ik分词器,title.en
自带的英文分词器。然后是用bulk api批量添加数据进去:
- POST http://192.168.159.159:9200/_bulk
- { "create": { "_index": "index1", "_type": "resource", "_id": 1 } }
- { "title": "周星驰最新电影" }
- { "create": { "_index": "index1", "_type": "resource", "_id": 2 } }
- { "title": "周星驰最好看的新电影" }
- { "create": { "_index": "index1", "_type": "resource", "_id": 3 } }
- { "title": "周星驰最新电影,最好,新电影" }
- { "create": { "_index": "index1", "_type": "resource", "_id": 4 } }
- { "title": "最最最最好的新新新新电影" }
- { "create": { "_index": "index1", "_type": "resource", "_id": 5 } }
- { "title": "I'm not happy about the foxes" }
注意bulk api要“回车”换行,不然会报错。
各种比较
1、对比ik分词,chinese分词和standard分词
- POST http://192.168.159.159:9200/index1/_analyze?analyzer=ik
- 联想召回笔记本电源线
ik测试结果:
- {
- "tokens": [
- {
- "token": "联想",
- "start_offset": 0,
- "end_offset": 2,
- "type": "CN_WORD",
- "position": 1
- },
- {
- "token": "召回",
- "start_offset": 2,
- "end_offset": 4,
- "type": "CN_WORD",
- "position": 2
- },
- {
- "token": "笔记本",
- "start_offset": 4,
- "end_offset": 7,
- "type": "CN_WORD",
- "position": 3
- },
- {
- "token": "电源线",
- "start_offset": 7,
- "end_offset": 10,
- "type": "CN_WORD",
- "position": 4
- }
- ]
- }
自带chinese和standard分词器的结果:
- {
- "tokens": [
- {
- "token": "联",
- "start_offset": 0,
- "end_offset": 1,
- "type": "<IDEOGRAPHIC>",
- "position": 1
- },
- {
- "token": "想",
- "start_offset": 1,
- "end_offset": 2,
- "type": "<IDEOGRAPHIC>",
- "position": 2
- },
- {
- "token": "召",
- "start_offset": 2,
- "end_offset": 3,
- "type": "<IDEOGRAPHIC>",
- "position": 3
- },
- {
- "token": "回",
- "start_offset": 3,
- "end_offset": 4,
- "type": "<IDEOGRAPHIC>",
- "position": 4
- },
- {
- "token": "笔",
- "start_offset": 4,
- "end_offset": 5,
- "type": "<IDEOGRAPHIC>",
- "position": 5
- },
- {
- "token": "记",
- "start_offset": 5,
- "end_offset": 6,
- "type": "<IDEOGRAPHIC>",
- "position": 6
- },
- {
- "token": "本",
- "start_offset": 6,
- "end_offset": 7,
- "type": "<IDEOGRAPHIC>",
- "position": 7
- },
- {
- "token": "电",
- "start_offset": 7,
- "end_offset": 8,
- "type": "<IDEOGRAPHIC>",
- "position": 8
- },
- {
- "token": "源",
- "start_offset": 8,
- "end_offset": 9,
- "type": "<IDEOGRAPHIC>",
- "position": 9
- },
- {
- "token": "线",
- "start_offset": 9,
- "end_offset": 10,
- "type": "<IDEOGRAPHIC>",
- "position": 10
- }
- ]
- }
结论不必多说,对于中文,官方的分词器十分弱。
2、搜索关键词“最新”和“fox”
测试方法:
- POST http://192.168.159.159:9200/index1/resource/_search
- {
- "query": {
- "multi_match": {
- "type": "most_fields",
- "query": "最新",
- "fields": [ "title", "title.cn", "title.en" ]
- }
- }
- }
我们修改query
和fields
字段来对比。
1)搜索“最新”,字段限制在title.cn
的结果(只展示hit部分):
- "hits": [
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "1",
- "_score": 1.0537746,
- "_source": {
- "title": "周星驰最新电影"
- }
- },
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "3",
- "_score": 0.9057159,
- "_source": {
- "title": "周星驰最新电影,最好,新电影"
- }
- },
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "4",
- "_score": 0.5319481,
- "_source": {
- "title": "最最最最好的新新新新电影"
- }
- },
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "2",
- "_score": 0.33246756,
- "_source": {
- "title": "周星驰最好看的新电影"
- }
- }
- ]
再次搜索“最新”,字段限制在title
,title.en
的结果(只展示hit部分):
- "hits": [
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "4",
- "_score": 1,
- "_source": {
- "title": "最最最最好的新新新新电影"
- }
- },
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "1",
- "_score": 0.75,
- "_source": {
- "title": "周星驰最新电影"
- }
- },
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "3",
- "_score": 0.70710677,
- "_source": {
- "title": "周星驰最新电影,最好,新电影"
- }
- },
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "2",
- "_score": 0.625,
- "_source": {
- "title": "周星驰最好看的新电影"
- }
- }
- ]
结论:如果没有使用ik中文分词,会把“最新”当成两个独立的“字”,搜索准确性低。
2)搜索“fox”,字段限制在title
和title.cn
,结果为空,对于它们两个分词器,fox和foxes不同。再次搜索“fox”,字段限制在title.en
,结果如下:
- "hits": [
- {
- "_index": "index1",
- "_type": "resource",
- "_id": "5",
- "_score": 0.9581454,
- "_source": {
- "title": "I'm not happy about the foxes"
- }
- }
- ]
结论:中文和标准分词器,不对英文单词做任何处理(单复数等),查全率低。
我的最佳配置
其实最开始创建的索引已经是最佳配置了,在title
下增加cn
和en
两个fields,这样对中文,英文和其他什么乱七八糟文的效果都好点。就像前面说的,title
使用标准分词器,title.cn
使用ik分词器,title.en
使用自带的英文分词器,每次搜索同时覆盖。
-学习的比较浅,又不对的地方,欢迎留言-
标签:Elasticsearch ,经验
为 Elasticsearch 添加中文分词,对比分词器效果的更多相关文章
- 为Elasticsearch添加中文分词,对比分词器效果
http://keenwon.com/1404.html Elasticsearch中,内置了很多分词器(analyzers),例如standard (标准分词器).english(英文分词)和chi ...
- 为Elasticsearch添加中文分词
Elasticsearch的中文分词很烂,所以我们需要安装ik.首先从github上下载项目,解压: cd /tmp wget https://github.com/medcl/elasticsear ...
- elasticsearch教程--中文分词器作用和使用
概述 本文都是基于elasticsearch安装教程 中的elasticsearch安装目录(/opt/environment/elasticsearch-6.4.0)为范例 环境准备 ·全新最小 ...
- 【自定义IK词典】Elasticsearch之中文分词器插件es-ik的自定义词库
Elasticsearch之中文分词器插件es-ik 针对一些特殊的词语在分词的时候也需要能够识别 有人会问,那么,例如: 如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”. 如 ...
- 如何给Elasticsearch安装中文分词器IK
安装Elasticsearch安装中文分词器IK的步骤: 1. 停止elasticsearch 2.2的服务 2. 在以下地址下载对应的elasticsearch-analysis-ik插件安装包(版 ...
- Elasticsearch之中文分词器插件es-ik(博主推荐)
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...
- 沉淀再出发:ElasticSearch的中文分词器ik
沉淀再出发:ElasticSearch的中文分词器ik 一.前言 为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了 ...
- Elasticsearch之中文分词器
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch的中文分词器 1.单字分词 ...
- 在eclipse中构建solr项目+添加core+整合mysql+添加中文分词器
最近在研究solr,这里只记录一下eclipse中构建solr项目,添加core,整合mysql,添加中文分词器的过程. 版本信息:solr版本6.2.0+tomcat8+jdk1.8 推荐阅读:so ...
随机推荐
- webpack教程——css的加载
首先要安装css的loader npm install css-loader style-loader --save-dev 然后在webpack.config.js中配置如下代码 意思是先用css- ...
- C++成员函数实现在类定义中与在类定义外的区别(Windows下直接使用g++)
c++ 类的成员函数放在类的外面来实现的写法,探究一下. 原文: http://www.cnblogs.com/findumars/p/6143375.html ------------------- ...
- 在CentOS VPS上源代码安装高版本号git
背景:个别软件在国内下载非常慢,在vps下载就非常快. 可是下载好后的文件通过scp弄出来的时候又非常慢,所以想通过在vps里安装git,通过gitlab或oschina来进行中转.但遗憾的是,上传到 ...
- 点评国内各大在线app生成平台
第一个:应用之星-无需编码的在线手机应用开发平台-移动开发平台-Androi应用开发 应用之星是免费的无需编码.基于组件的在线手机应用开发平台,app软件开发平台,手机软件开发平台,为移动开发人员减少 ...
- Hadoop - MapReduce MRAppMaster-剖析
一 概述 MRv1主要由编程模型(MapReduce API).资源管理与作业控制块(由JobTracker和TaskTracker组成)和数据处理引擎(由MapTask和Redu ...
- C++高精度性能測试函数
在实际software开发工作中.我们常常会測试某个module或者function的执行效率.或者是某个算法的时间复杂度(尽管时间复杂度一定程度上依赖于机器性能.但在同一台computer上,经过算 ...
- CON1023 明明的计划
比赛说明 邀请码:a08f 来源:自出 描述:无 难度:NOIP提高组day1 赛时答疑:私信询问 奖励:无 试题列表 赛题 #A:数学题赛题 #B:明明泡妹子赛题 #C:明明去酒店 U5012 数学 ...
- 学界| UC Berkeley提出新型分布式框架Ray:实时动态学习的开端—— AI 应用的系统需求:支持(a)异质、并行计算,(b)动态任务图,(c)高吞吐量和低延迟的调度,以及(d)透明的容错性。
学界| UC Berkeley提出新型分布式框架Ray:实时动态学习的开端 from:https://baijia.baidu.com/s?id=1587367874517247282&wfr ...
- hdu 3037Saving Beans(卢卡斯定理)
Saving Beans Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 【贪心】小Y的炮[cannon]题解
模拟赛的题目,做的时候由于第二题表打太久了,只剩下40分钟,想都没想就写了一个爆搜20分... 这道题单调性很关键,下面会解释 P.S.解释在代码里 #include<cstdio> #i ...