最近在使用ElasticSearch来查询我们的一些实时数据,中间也遇到不少的问题,今天在此简单总结记录一下。es的功能的确十分强大,大部分数据库能实现的需求,基本在es里面都能实现,当然两者都有一些特殊的功能,是双方不能实现或者不容易实现的。
案例一:
es单个字段分组后,分页是个小坑,因为分组结果里面,只提供了size来限制返回,并没有类似offset和limit的参数来支持分页,所以这个地方,一般提供的是top N的分组数据,如果想分页,只能自己在内存中实现。
案例二:
如下面的sql:
select a, b , count(*) as c form t1 group a, b order by c desc
在es多个字段分组后,排序都是组内有序,而不是整体数据有序,如果想实现整体数据有序,有两种解决办法可以解决:
方法一:
使用agg-script,使用script来实现聚合,这样唯一的缺点就是大数据量下,耗时比较高。
//多字段分组
TermsBuilder one = AggregationBuilders.terms("one").script(new Script("doc['stid'].value +'#' + doc['qid'].value"));
方法二:
使用copy字段,将多维字段,提供合并成一个字段,这样分组时候就可以直接使用这个字段进行分组,效率较高,但灵活性比较低,如果要是有7,8个字段都需要两两组合分组,那么索引里面的冗余字段就会多出好多个,索引体积的增大也会影响检索和聚合性能。
{
"mappings": {
"test": {
"properties": {
"f": {
"type": "string",
"index": "not_analyzed",
"copy_to": "f_and_g"
},
"g": {
"type": "string",
"index": "not_analyzed",
"copy_to": "f_and_g"
},
"f_and_g": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
当然上面的分组能处理,但是分页问题依然和案例一是一样的情况,所有的分组都有这个问题。
案例三:
如下面的sql:
select max(tt.su1),max(tt.su2)
FROM
(
select name ,sum(c1) as su1 ,sum(c2) as su2 from tp group by name
) as tt
上面这个sql,是分组某个字段后,对其中几个指标进行sum,完事之后,在外层又要取到sum后的某个指标的最大值,这个问题在1.x的es中是不能解决的,但是在2.x之后,es提供了管道聚合,其功能更加强大,类似实现数据里面的多个子查询的功能。
下面我们看看如何使用es来完成上面的这个功能:
java代码如下:
//构建查询请求体
SearchRequestBuilder search = client.prepareSearch("spark").setTypes("spark");
//分组字段是id,排序由多个字段排序组成
TermsBuilder tb= AggregationBuilders.terms("name").field("name");
//添加两个sum指标
tb.subAggregation(AggregationBuilders.sum("c1").field("c1"));
tb.subAggregation(AggregationBuilders.sum("c2").field("c2"));
//添加管道聚合获取max值
MaxBucketBuilder maxx= PipelineAggregatorBuilders.maxBucket("max").setBucketsPaths("name>c1");
MaxBucketBuilder maxx2= PipelineAggregatorBuilders.maxBucket("max2").setBucketsPaths("name>c2");
//封装聚合实体
search.addAggregation(maxx);
search.addAggregation(maxx2);
search.addAggregation(tb);
//获取指标里面的最大值
InternalBucketMetricValue imb=search.get().getAggregations().get("max") ;
InternalBucketMetricValue imb2=search.get().getAggregations().get("max2") ;
//输出值的结果
System.out.println(imb.value());
System.out.println(imb2.value());
client.close();
curl如下:
{
"aggregations" : {
"max" : {
"max_bucket" : {
"buckets_path" : [ "name>c1" ]
}
},
"max2" : {
"max_bucket" : {
"buckets_path" : [ "name>c2" ]
}
},
"name" : {
"terms" : {
"field" : "name"
},
"aggregations" : {
"c1" : {
"sum" : {
"field" : "c1"
}
},
"c2" : {
"sum" : {
"field" : "c2"
}
}
}
}
}
}
总结:从上面的几个案例看,es在分组时候的需要考虑的问题要多点,但也大部分都能使用scrpit方式解决,但分组的分页问题,确实不太好弄,这个地方基本上都是看topN的数据比较方便,如果非要看所有的数据,而且必须分页,那只能在内存总实现了,所以建议这个地方需要慎重考虑。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。...还重点总结了安装过程中遇到的一些问题以及解决方案。
elasticsearch 集群安装手册,安装过程中遇到的问题都有总结,照着做一般没有问题
ie和火狐的兼容问题总结了火狐(FF)浏览器与IE在css和js中的不同之处,完美的解决各位在工作中遇到的技术困难
Java前后开发面试题,大厂进阶之路,基于JavaGuide、Cyc大佬、牛客...包含计算机网络知识、JavaSE、JVM、Spring、Springboot、SpringCloud、Mybatis、多线程并发、netty、MySQL、MongoDB、Elasticsearch、Redis、HBASE
在学习的过程中,我遇到了一些挑战,比如配置文件的理解和注解的正确使用,但通过查阅官方文档和阅读相关书籍,我逐渐解决了这些问题。最终,我能够独立地使用Spring Boot开发Web应用程序,并运用其优秀的特性提高了...
【ElasticSearch】目录下为学习ElasticSearch的总结 - 【MQ】目录下为学习MQ练习的代码 【activiti】目录下为学习activiti练习的代码 【leetcode】目录下为Leetcode 刷题总结以及代码 【Redis】目录下为使用Redis和...
9. 增加灯光效果和材质属性 由于之前没有接触过,所以先进行了学习,然后再增加,遇到的问题是写增加灯光效果的时候,由于疏忽,三种光效属性中均写成了对环境光的修改,所以多费了些时间;在对材质属性进行增加的...
Flash Builder 4 正式版+JAVA+LCDS ES2+Hibernate 配置详解 开发平台: Eclipse 3.5 + Flash Builder 4...Flash Builder 4 正式版已经出来,现在正在试用,将一些遇到的问题总结出来。并已经解决,希望对大家有帮助。
一句话总结汇总: Copy project into workspace 和add project into work set 的含义 数字签名总结 JNI 基础及注意: Ndk的使用方法: Ant 与 android update project 命令行只有在非根盘符上才能运行 android ...
Rails 3 升级 Rails 4 中遇到的问题及解决方法 php性能优化 Java中的 equals() 和 hashCode() 契约 程序设计 IOS缓存机制详解 ios系类教程之用instruments来检验你的app Android 学习笔记之 SQLite基础用法 如何...
elasticsearch mysql linux nginx rsyslog 隐藏浏览器滚动条 meta 标签配置 路径解析为树形结构 富文本编辑 工具代码 h5 唤醒 app 微信相关 网站相关 图片转 base64 绘制平滑的 canvas 曲线 算法理解 排序 冒泡排序 ...
项目从es2升级到es6,groovy脚本也要相应的转换为painless脚本,转换过程中遇到了很多坑,特此总结成文档,供大家一起交流学习。
解决Access中分组报表的问题
Flash Builder4 下 LCDS + JAVA 配置方法详解 Flash Builder 4正式版+JAVA+LCDS ES2(LCDS3) Flash Builder 4 正式版已经出来,将一些遇到的问题总结出来。并已经解决,希望对大家有帮助。
基于知识图谱的医疗诊断知识问答系统,先看了一遍视频,然后把代码下载下来,自己实现了一遍,遇到不懂得地方就再看视频,现在基本把这个项目搞明白了,写个总结分享一下,后期会在现有的基础上做一些横向拓展。...
ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015...Typora软件记录的学习笔记 适用于小白,内容包含了我们平时常用到的知识,还有一些平时遇到问题的总结。供大家参考。
opengl es中建模有很多种工具,我这里记录了几种我遇到的几个!MD2是Quake2里的模型文件格式,带有顶点动画;MS3D模型文件格式,全称MilkShape 3D,是一种带骨骼动画的模型格式……
这两种情形在实际开发中有很多应用场景,本文是我在工作学习中遇到的几种应用场景的总结。 回调函数 代码复用是衡量一个应用程序的重要标准之一。通过将变化的业务逻辑抽离封装在回调函数中能够有效的提高代码...
面试遇到一个问题:JS数组求和函数。我第一想到的就是数组循环。然而我觉得面试官问这个问题一定不是想考这个人人皆知的方法。当时机智的我竟然想到了递归函数不断加和数组的项,然而折腾了好久都没调好方法,事实...
通过遵循制作一个“双重包”(CommonJS和ES模块中JavaScript包)蒂姆·卡什的演习构想1.)编写一个无需使用promises或npm库即可获取我的github回购计数的程序(这表明他们了解如何使用回调和errbacks,使用nodejs...