Elasticsearch 使用中文分词

本文演示了如何使用IK Analysis 插件来实现在 Elasticsearch 中的中文分词功能。

使用中文分词

在“Spring Boot应用企业级博客系统”课程中(http://coding.imooc.com/class/125.html),所有的博客功能都已经完成了。读者朋友们开始愉快地使用博客来发表博客了。但如果朋友们足够细心的话,发现在输入中文的标签的时候,存在一定的问题。

比如,当我们想将某个博客标记为“大神”时,博客系统却将这个单词粗暴的分成了如图21-2所示的两个词“大”和“神”。显然,这并不符合用户的使用习惯。

这是 Elasticsearch 语言分析器上的限制,它并不能友好的处理所有语言,特别是中文。这种情况下,我们就需要额外的中文分词器来协助我们了。

本章节,我们将演示使用 IK Analysis 插件来帮助我们实现中文分词。

IK Analysis 插件

IK Analysis 插件(https://github.com/medcl/elasticsearch-analysis-ik/)就是一款专门用于 Elasticsearch 的分词器,可以友好的处理中文。

IK Analysis 插件将 Lucene IK 分析仪(http://code.google.com/p/ik-analyzer/)集成到了 Elasticsearch 中,从而支持自定义分词。

安装 IK Analysis

安装 IK Analysis 非常简单。主要有两种方式。

使用 elasticsearch-plugin

如果 Elasticsearch 是 5.5.1 以后的版本,可以使用 elasticsearch-plugin 来安装,安装方式如下:

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip

下载解压到指定目录

另外一种方式是,下载安装包,解压到 Elasticsearch 安装目录的 /plugins/目录下即可。

下图展示了 IK 的安装目录。

需要注意的是,不管是哪种安装方式,相应的插件,要对应相应的 Elasticsearch 版本,否则可能会安装不成功。
下载地址为 https://github.com/medcl/elasticsearch-analysis-ik/releases。本章节,我们使用 IK Analysis for Elasticsearch 5.5.0 版本。

使用 IK Analysis

要使用 IK Analysis,需要在文档类里面,指定相应的分词器。我们在 EsBlog 的 tags 属性上,添加了searchAnalyzer = "ik_smart", analyzer = "ik_smart"的注解内容就可以了。

public class EsBlog implements Serializable {

    ...

    @Field(type = FieldType.text,fielddata = true, searchAnalyzer = "ik_smart", analyzer = "ik_smart")
    private String tags;  // 标签

下图展示了使用了IK分词的标签效果

IK Analysis 类型

ik_smart 是 IK Analysis 其中一种分词形式。IK Analysis主要有两种类型的分词形式,分别是 ik_max_word 和 ik_smart。

  • ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国”、“中华人民”、“中华”、“华人”、“人民共和国”、“人民”、“人”、“民”,、“共和国”、“共和”、“和”、“国歌”等,会穷尽各种可能的组合;
  • ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国”、“国歌”。

参考

时间: 2024-12-11 16:48:54

Elasticsearch 使用中文分词的相关文章

基于 Ansj 的 elasticsearch 2.3.1 中文分词插件

前言 这是一个elasticsearch的中文分词插件,基于Ansj中文分词.发起者Onni大神. 2.3.1插件安装 进入Elasticsearch目录运行如下命令 进入es目录执行如下命令 ./bin/plugin install http://maven.nlpcn.org/org/ansj/elasticsearch-analysis-ansj/2.3.1/elasticsearch-analysis-ansj-2.3.1-release.zip 更新内容 elasticsearch更新

如何在Elasticsearch中安装中文分词器(IK+pinyin)

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. 这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题. 本篇文章按照下面的内容进行描述: 分词器的作用 安装IK 简单的测试 模拟测试 安装elasticsearch-analysis-piny

安装elasticsearch及中文IK和近义词配置

安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elasticsearch 其实es的安装非常简单了 https://www.elastic.co/downloads/elasticsearch cd /tmp wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearc

ElasticSearch 安装 ik 分词插件

       在搜索领域,中文分词一直都是难题.经过很多大牛的不懈努力,还是出现了一些很不错的中文分词器,比如本文提到的IK.本文主要基于ES,安装ik分词插件.        一.IK简介     IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件.从3.0版本开 始,IK发展为面向Java的公用分

elasticsearch查询中文时,返回结果为空

问题描述 elasticsearch查询中文时,返回结果为空 如下图所示,elasticsearch配置的时IK中文分词,可以确定分词没问题.这是分词效果: 索引中也有相关的数据文档: ? 但是查询"湖北"的时候,查询返回结果为空: 即使将"湖北"换成"湖",也是一样,返回结果始终为空,但是查询英文就是正常的. 这到底是什么原因呢?求解~ 解决方案 你好,你的问题解决了吗?我的也是这个问题,求分享! 解决方案二: 可能是编码问题,中文需要进行 u

使用 Elasticsearch 的 NGram 分词器处理模糊匹配

接到一个任务:用 Elasticsearch 实现搜索银行支行名称的功能.大概就是用户输入一截支行名称或拼音首字母,返回相应的支行名称.比如,用户输入"工行"或者"gh",我需要返回"工行XXX分行"类似这样的结果. 我心里嘀咕着:数据库不是支持通配符查询吗?为什么不直接用数据库查询? 说归说,但是任务还是要完成的.之前有在网上看过一篇文章,主要就是说用 Elasticsearch 处理通配符查询不太适合,然后我在评论中看到作者推荐了一个分词器

数学之美 系列二 -- 谈谈中文分词

谈谈中文分词----- 统计语言模型在中文处理中的一个应用 上回我们谈到利用统计语言模型进行语言处理,由于模型是建立在词的基础上的,对于中日韩等语言,首先需要进行分词.例如把句子 "中国航天官员应邀到美国与太空总署官员开会." 分成一串词:中国 / 航天 / 官员 / 应邀 / 到 / 美国 / 与 / 太空 / 总署 / 官员 / 开会. 最容易想到的,也是最简单的分词办法就是查字典.这种方法最早是由北京航天航空大学的梁南元教授提出的. 用 "查字典" 法,其实就

ASP.NET编写简单的中文分词程序

asp.net|程序|中文 几个月之前,在网上找到了一个中文词库素材(几百K),当时便想写一个分词程序了.我对汉语分词没有什么研究,也就凭自己臆想而写.若有相关方面专家,还请多给意见. 一.词库 词库大概有5万多词语(google能搜到,类似的词库都能用),我摘要如下: 地区    82重要    81新华社    80技术    80会议    80自己    79干部    78职工    78群众    77没有    77今天    76同志    76部门    75加强    75组

什么是中文分词

中文 什么是中文分词? 众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思.例如,英文句子I am a student,用中文则为:"我是一个学生".计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白"学"."生"两个字合起来才表示一个词.把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词.我是一个学生,分词的结果是:我是 一个 学生. 目前主流的中文