最近在使用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 API时,可能会遇到网络问题、JSON编码错误等。确保正确处理返回的响应对象,检查`error`和`status`字段,以便于调试。 6. **最佳实践** - 使用版本控制,避免直接在生产环境中升级Elastic...
在处理ElasticSearch启动后自动终止(Killed)的问题过程中,作者遇到了一系列挑战。这个问题最早在上周出现,并持续影响系统的正常使用。最终,作者找到了解决问题的关键步骤,并在此进行分享。 #### 问题概述 当...
- Elasticsearch拥有庞大的开发者社区,提供了丰富的文档、示例和社区支持,遇到问题时,用户可以很容易地找到解决方案。 总结来说,Elasticsearch 2.4.1是一个强大且稳定的搜索和分析引擎,其分布式特性、实时性...
Elasticsearch 5.6.3 是一个高度可扩展、高性能的开源全文搜索引擎,由Apache许可协议发布。...如果你遇到无法访问网站的问题,下载并安装这个版本的Elasticsearch,将有助于本地搭建搜索环境,进行数据管理和分析。
- 如果遇到连接问题,检查 Elasticsearch 的配置,确保允许从 Elasticsearch-Head 的IP地址访问。 总结,Elasticsearch-Head 作为一个强大的可视化工具,极大地简化了 Elasticsearch 的日常管理和维护工作。通过...
如果在启动过程中遇到问题,可能需要检查Elasticsearch的日志文件以获取错误信息。 **使用与配置** 在使用IK分词器时,需要在Elasticsearch的索引模板或者索引设置中进行配置。例如,可以在`settings`部分指定`...
两者各有优势,但在某些场景下,我们可能需要将HBase中的数据同步到Elasticsearch,以利用ES的实时搜索和分析能力。这就是"Elasticsearch-HBase-River"的作用。 **Elasticsearch-HBase-River插件** Elasticsearch-...
Elasticsearch 5.4 是一个功能强大的搜索引擎,但是在使用过程中,仍然会遇到一些问题,例如 ES Client 获取慢和内存溢出等问题。解决这些问题需要深入研究 ES 的源码,了解 ES 的工作原理,并且通过设置来控制 ES ...
在本例中,我们将详细探讨如何使用Intellij IDEA来编译和调试Elasticsearch 6.1.0源码。Elasticsearch是一个基于Lucene构建的开源搜索引擎,它允许用户快速执行全文搜索、结构化搜索甚至是复杂分析。Intellij IDEA是...
### ElasticSearch安装说明 #### 一、ElasticSearch概述与版本要求 ElasticSearch(简称 ES)是一款基于Lucene的搜索引擎。...遵循上述步骤,可以帮助用户顺利完成 ElasticSearch 的安装,并解决一些常见的问题。
总结来说,Spring Boot与Elasticsearch的整合让开发者能够轻松地在微服务环境中实现高效的数据检索功能。通过配置依赖、创建实体、定义Repository接口,以及利用`@Query`注解,我们可以实现各种复杂的查询操作。在...
总结来说,Elasticsearch的SQL插件是将SQL查询能力引入到Elasticsearch中的一个重要工具,它极大地拓宽了Elasticsearch的使用场景,使得那些熟悉SQL的用户无需额外学习新的查询语法就能高效地操作和分析Elastic...
### Hive中的复杂数据类型导入至Elasticsearch (ES) 的问题总结 #### 一、背景介绍 在大数据处理领域,Apache Hive 和 Elasticsearch (ES) 是两种非常重要的工具。Hive 主要用于对存储在 Hadoop 文件系统 (HDFS) 中...
### Hive与Elasticsearch中的经纬度数据处理 #### 背景介绍 在大数据处理领域,Hive(Hadoop数据库)常被用于处理结构化数据,而Elasticsearch(ES)则以其强大的全文检索功能著称。在某些应用场景中,需要将Hive中...
elasticsearch 集群安装手册,安装过程中遇到的问题都有总结,照着做一般没有问题
在本项目"springboot+elasticsearch"中,开发者提供了一个全面的入门教程,涵盖了Elasticsearch的基本操作,包括增、删、改、查等基本功能,这对于初学者理解这两者如何协同工作非常有帮助。 首先,让我们深入了解...
"elasticsearch-analysis-ik-7.zip" 文件是一个针对 Elasticsearch 7.3.2 版本的 IK 分词器压缩包,提供了一个快速且便捷的安装方式,以避免从 Github 等远程仓库下载时可能遇到的网络速度问题。 在 Elasticsearch ...
总结来说,本教程详细介绍了在Windows环境下通过Python脚本实现MongoDB与Elasticsearch的实时同步的过程,包括安装软件、配置数据库、启动同步服务以及遇到问题时的处理方法,对于希望实现数据自动同步的开发者来说...