环境: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_analyzeranalyzer 相同是为了确保搜索时和索引时使用相同的分词器,以确保查询中的术语与反向索引中的术语具有相同的格式。如果不设置 search_analyzer,则 search_analyzeranalyzer 相同。详细请查阅: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分词相关推荐

  1. Elasticsearch中安装IK分词器

    Elasticsearch中默认的分词器对中文的支持不好,会分隔成一个一个的汉字.而IK分词器对中文的支持比较好一些,主要有两种模式"ik_smart"和"ik_max_ ...

  2. ElasticSearch用法和IK分词器

    ElasticSearch用法和IK分词器 ElasticSearch 是什么? 为什么选择ES? ES提供的能力 ES常用使用场景 ES架构 ES 基本概念 ES 数据类型 ElasticSearc ...

  3. 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程

    docker安装配置elasticsearch,kibana和IK分词器 elasticsearch文章系列 前置安装docker 创建docker网络 安装Elasticsearch 运行elast ...

  4. Elasticsearch下安装ik分词器

    安装ik分词器(必须安装maven) 上传相应jar包 解压到相应目录 unzip elasticsearch-analysis-ik-master.zip(zip包) cp -r elasticse ...

  5. 【Elasticsearch】es IK分词器的安装

    1.概述 [Elasticsearch]es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么 之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字 ...

  6. window10下安装Elasticsearch(es)和IK分词器

    1 安装Elasticsearch 7.x  1.1 下载地址 https://www.elastic.co/cn/downloads/elasticsearch 1.2 下载后解压的目录结构 Ela ...

  7. Elasticsearch插件管理(ik分词器、附件文本抽取插件)

    倒排索引 Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索.见其名,知其意,有倒排索引,肯定会对应有正向索引.正向索引(forward index),反向索引(inver ...

  8. ElasticSearch学习:ik分词器

    IK分词器是关于中文的一个分词器,有IK分词器自然还有别的分词器,比如说pinyin分词器针对的是拼音分词,letter针对的是letter分词等,ES有一个很好的方式就是通过插件的形式来扩展这些功能 ...

  9. Elasticsearch拼音和ik分词器的结合应用

    一.创建索引时,自定义拼音分词和ik分词 PUT /my_index {"index": {"analysis": {"analyzer": ...

  10. ElasticSearch——IK分词器的下载及使用

    ElasticSearch--IK分词器的下载及使用 1.什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器 分词方式 StandardAnalyzer 单字分词 CJKAna ...

最新文章

  1. npm包开发测试与发布
  2. 只用静态图像,就能实时渲染出丝滑3D效果 | CVPR 2021 Oral
  3. 逻辑电路 - 与非门Nand Gate
  4. WebView的截屏实现
  5. Python Dict用法
  6. ios键盘横屏_cocos2d 3.2版本IOS因键盘引起横竖屏问题
  7. 大数据技术hadoop入门级生态圈介绍
  8. thinkPHP5.0表单令牌使用
  9. 6月26号.NET面试题(程序题部分)只要做懂这3道题肯定能脱离菜鸟称号!
  10. 使用detours实现劫持
  11. oracle函数 NLS_INITCAP(x[,y])
  12. php创建游戏房间思路,php设计模式之建造器模式分析【星际争霸游戏案例】
  13. php商城教学视频教程,布尔教育ThinkPHP商城实战视频教程的课件源码分享
  14. 小波分析 瞬态信号 matlab,小波变换在瞬态信号波至点检测中的应用研究
  15. [手机分享]黑莓手机7系列分享之——黑莓7290
  16. 2022-2027年中国股权众筹行业市场调研及未来发展趋势预测报告
  17. React Native 实践之携程 Moles 框架
  18. stackoverflow热门问题(二)- 如何确定C的数组的大小
  19. 像扫二维码一样的快速录入银行卡信息
  20. Windows 和 Linux 系统查询 IP 地址命令

热门文章

  1. 从零实现循环神经网络
  2. 灵活地横向扩展:从文件系统到分布式文件系统
  3. 冬日暖阳,侯捷畅谈技术人生与读书感悟
  4. 电子工业出版社博文视点图书在微软VS2010全球发布会上受追捧
  5. matplotlib绘图进阶
  6. linux查看谷歌服务,如何查询Linux服务的作用
  7. python的invalid syntax是什么意思_python中出现invalid syntax报错的几种原因
  8. php手术多久就不疼了,自己腹部刚开刀口没几天,却站了5小时为患者手术
  9. Android SQLiteDatabase.query()各个参数的意义
  10. 7-9 龟兔赛跑 (20 分)