起因

需要在ES中使用聚合进行统计分析,但是聚合字段值为中文,ES的默认分词器对于中文支持非常不友好:会把完整的中文词语拆分为一系列独立的汉字进行聚合,显然这并不是我的初衷。我们来看个实例:

POST http://192.168.80.133:9200/my_index_name/my_type_name/_search
{
"size": 0,
"query" : {
"range" : {
"time": {
"gte": 1513778040000,
"lte": 1513848720000
}
}
},
"aggs": {
"keywords": {
"terms": {"field": "keywords"},
"aggs": {
"emotions": {
"terms": {"field": "emotion"}
}
}
}
}
}

输出结果:

{
"took": 22,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 32,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"keywords": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "力", # 完整的词被拆分为独立的汉字
"doc_count": 2,
"emotions": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": -1,
"doc_count": 1
},
{
"key": 0,
"doc_count": 1
}
]
}
},
{
"key": "动",
"doc_count": 2,
"emotions": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": -1,
"doc_count": 1
},
{
"key": 0,
"doc_count": 1
}
]
}
}
]
}
}
}

既然ES的默认分词器对于中文支持非常不友好,那么有没有可以支持中文的分词器呢?如果有,该如何使用呢?

第一个问题,万能的谷歌告诉了我结果,已经有了支持中文的分词器,而且是开源实现:IK Analysis for Elasticsearch,详见:https://github.com/medcl/elasticsearch-analysis-ik。

秉着“拿来主义”不重复造轮子的指导思想,直接先拿过来使用一下,看看效果怎么样。那么,如何使用IK分词器呢?其实这是一个ES插件,直接安装并对ES进行相应的配置即可。

安装IK分词器

我的ES版本为2.4.1,需要下载的IK版本为:1.10.1(注意:必须下载与ES版本对应的IK,否则不能使用)。

1.下载,编译IK

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.10.1/elasticsearch-analysis-ik-1.10.1.zip
unzip elasticsearch-analysis-ik-1.10.1.zip
cd elasticsearch-analysis-ik-1.10.1
mvn clean package

在elasticsearch-analysis-ik-1.10.1\target\releases目录下生成打包文件:elasticsearch-analysis-ik-1.10.1.zip。

2.在ES中安装IK插件

将上述打包好的IK插件:elasticsearch-analysis-ik-1.10.1.zip拷贝到ES/plugins目录下,执行解压。

unzip elasticsearch-analysis-ik-1.10.1.zip
rm -rf elasticsearch-analysis-ik-1.10.1.zip # 解压完之后一定要删除这个zip包,否则在启动ES时报错

重启ES。

使用IK分词器

安装IK分词器完毕之后,就可以在ES使用了。

第一步:新建index

PUT http://192.168.80.133:9200/my_index_name

第二步:给将来要使用的doc字段添加mapping

在这里我在ES中存储的doc格式如下:

{
"nagtive_kw": []
"is_all": false,
"emotion": 0,
"focuce": false,
"keywords": ["动力","外观","油耗"], // 在keywords字段上进行聚合分析
"source": "汽车之家",
"time": -1,
"machine_emotion": 0,
"title": "no title",
"spider": "qczj_index",
"content": {},
"url": "http://xxx",
"brand": "宝马",
"series": "宝马1系",
"model": "2017款"
}

需要在keywords字段上进行聚合分析,所以给keywords字段添加mapping设置:

POST http://192.168.80.133:9200/my_index_name/my_type_name/_mapping
{
"properties": {
"keywords": { # 设置keywords字段使用ik分词器
"type": "string",
"store": "no",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"boost": 8
}
}
}

注意: 在设置mapping时有一个小插曲,我根据IK的官网设置“keywords”的type为“text”时报错:

POST http://192.168.80.133:9200/my_index_name/my_type_name/_mapping
{
"properties": {
"keywords": {
"type": "text", # text类型在2.4.1版本中不支持
"store": "no",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"boost": 8
}
}
}

报错:

{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "No handler for type [text] declared on field [keywords]"
}
],
"type": "mapper_parsing_exception",
"reason": "No handler for type [text] declared on field [keywords]"
},
"status": 400
}

这是因为我使用的ES版本比较低:2.4.1,而text类型是ES5.0之后才添加的类型,所以不支持。在ES2.4.1版本中需要使用string类型。

第三步:添加doc对象

POST http://192.168.80.133:9200/my_index_name/my_type_name/
{
"nagtive_kw": ["动力","外观","油耗"]
"is_all": false,
"emotion": 0,
"focuce": false,
"keywords": ["动力","外观","油耗"], // 在keywords字段上进行聚合分析
"source": "汽车之家",
"time": -1,
"machine_emotion": 0,
"title": "从动次打次吃大餐",
"spider": "qczj_index",
"content": {},
"url": "http://xxx",
"brand": "宝马",
"series": "宝马1系",
"model": "2017款"
}

第四步:聚合分析

POST http://192.168.80.133:9200/my_index_name/my_type_name/_search
{
"size": 0,
"query" : {
"range" : {
"time": {
"gte": 1513778040000,
"lte": 1513848720000
}
}
},
"aggs": {
"keywords": {
"terms": {"field": "keywords"},
"aggs": {
"emotions": {
"terms": {"field": "emotion"}
}
}
}
}
}

输出结果:

{
"took": 22,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 32,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"keywords": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "动力", # 完整的词没有被拆分为独立的汉字
"doc_count": 2,
"emotions": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": -1,
"doc_count": 1
},
{
"key": 0,
"doc_count": 1
}
]
}
}
]
}
}
}

【参考】

http://www.cnblogs.com/xing901022/p/5910139.html 如何在Elasticsearch中安装中文分词器(IK+pinyin)

https://elasticsearch.cn/question/47 关于聚合(aggs)的问题

https://github.com/medcl/elasticsearch-analysis-ik/issues/276 create map时出现No handler for type [text] declared on field [content] #276

http://blog.csdn.net/guo_jia_liang/article/details/52980716 Elasticsearch2.4学习(三)------Elasticsearch2.4插件安装详解

Elasticsearch入门之从零开始安装ik分词器的更多相关文章

  1. Linux下,非Docker启动Elasticsearch 6.3.0,安装ik分词器插件,以及使用Kibana测试Elasticsearch,

    Linux下,非Docker启动Elasticsearch 6.3.0 查看java版本,需要1.8版本 java -version yum -y install java 创建用户,因为elasti ...

  2. Linux使用Docker启动Elasticsearch并配合Kibana使用,安装ik分词器

    注意事项 这里我的Linux虚拟机的IP地址是192.168.1.3 Docker运行Elasticsearch容器之后不会立即有反应,要等一会,等待容器内部启动Elasticsearch,才可以访问 ...

  3. 【ELK】【docker】【elasticsearch】1. 使用Docker和Elasticsearch+ kibana 5.6.9 搭建全文本搜索引擎应用 集群,安装ik分词器

    系列文章:[建议从第二章开始] [ELK][docker][elasticsearch]1. 使用Docker和Elasticsearch+ kibana 5.6.9 搭建全文本搜索引擎应用 集群,安 ...

  4. Elasticsearch下安装ik分词器

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

  5. ElasticSearch(六):IK分词器的安装与使用IK分词器创建索引

    之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了. 1. i ...

  6. windows下elasticsearch安装ik分词器后无法启动

    windows下elasticsearch安装ik分词器后启动报如下图错误: 然后百度说是elasticsearch路径有空格,一看果然我的路径有空格,然后重新换个路径就好了.

  7. 如何开发自己的搜索帝国之安装ik分词器

     Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词,我是中国人 不能简单的分成一个个字,我们更希望 “中国人”,“中国”,“我”这样的分词,这样我们就需要 ...

  8. Elastic Stack 笔记(二)Elasticsearch5.6 安装 IK 分词器和 Head 插件

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 作为开源搜索引擎服务器,其核心功能在于索引和搜索数据.索引是把文档写入 Elasticsearch 的过程, ...

  9. ElasticSearch5.3安装IK分词器并验证

    ElasticSearch5.3安装IK分词器 之前使用Elasticsearch安装head插件成功了,但是安装IK分词器却失败了.貌似是ElasticSearch5.0以后就不支持直接在elast ...

随机推荐

  1. spring cloud + mybatis 分布式 微服务 b2b2c 多商户商城 全球部署方案

    用java实施的电子商务平台太少了,使用spring cloud技术构建的b2b2c电子商务平台更少,大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B ...

  2. Apache Ignite上的TensorFlow

    任何深度学习都是从数据开始的,这是关键点.没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要.在做研究.构建新的神经网络架构.以及做实验时,会习惯于使用最简单的本地数据 ...

  3. [SPOJ375]QTREE - Query on a tree【树链剖分】

    题目描述 给你一棵树,两种操作. 修改边权,查找边权的最大值. 分析 我们都知道,树链剖分能够维护点权. 而且每一条边只有一个,且唯一对应一个儿子节点,那么就把信息放到这个儿子节点上. 注意,lca的 ...

  4. mysql5.6做单向主从复制Replication

    原理场景:MySQL从3.23版本开始提供复制功能.指的是将主数据库的DDL和DML操作通过二进制日志传到从服务器(也叫从库),然后在从库上对这些日志重新执行, 从而使得从库和主库的数据保持同步. 优 ...

  5. CSharp for Jupyter Notebook

    之前说有机会就说下Linux下如何搭建C#版的交互编程,今天写篇文章还债^_^ Win下比较简单,可以自己看官方文档,下面逆天带大家搭建下Linux下的环境(官方方法有问题) 在线预览:https:/ ...

  6. JavaWeb基础之Servlet简单实现用户登陆

    学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...

  7. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  8. 【SPOJ10707】COT2 - Count on a tree II

    题目大意:给定一棵 N 个节点的无根树,每个节点有一个颜色.现有 M 个询问,每次询问一条树链上的不同颜色数. 题解:学会了树上莫队. 树上莫队是将节点按照欧拉序进行排序,将树上问题转化成序列上的问题 ...

  9. NLog类库使用探索——编程配置

    以编程的方式配置,这是我项目中的,我都不知道为什么使用编程.直接配置不很好吗,估计他也没有研究.直接上步骤和代码: 创建一个LoggingConfiguration对象,用来保存配置信息 至少创建一个 ...

  10. Django 异步化库celery和定时任务

    首先要了解Django其实是个同步框架,那么多个用户发送请求时就会发生排队的情况上一个用户的请求完成后在进行下一个,这样会对影响用户体验,所有就要用到异步方法来解决. 首先我们要安装celery库 p ...