把Elasticsearch当成Database用,因为Elasticsearch不支持SQL,就需要把SQL转换成代码实现。

1.按某个field group by查询count

SELECT
fieldA, COUNT(fieldA)
from table
WHERE fieldC = "hoge"
AND fieldD = "huga"
AND fieldB > 10
AND fieldB < 100
group by fieldA;

对应的java code:

SearchRequestBuilder searchReq = client.prepareSearch("sample_index");
searchReq.setTypes("sample_types");
TermsBuilder termsb = AggregationBuilders.terms("my_fieldA").field("fieldA").size(100);BoolFilterBuilder bf = FilterBuilders.boolFilter();
TermFilterBuilder tf_fieldC = FilterBuilders.termFilter("fieldC","hoge");
TermFilterBuilder tf_fieldD = FilterBuilders.termFilter("fieldD","huga");
bf.must(tf_fieldC);
bf.must(tf_fieldD);RangeFilterBuilder rangefieldBFilter = FilterBuilders.rangeFilter("fieldB").gt(10).lt(100);searchReq.setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),FilterBuilders.andFilter(bf, rangefieldBFilter))).addAggregation(termsb);
SearchResponse searchRes = searchReq.execute().actionGet();Terms fieldATerms = searchRes.getAggregations().get("my_fieldA");
for (Terms.Bucket filedABucket : fieldATerms.getBuckets()) {//fieldAString fieldAValue = filedABucket.getKey();//COUNT(fieldA)long fieldACount = filedABucket.getDocCount();
}

2. 按某个field 和 date group by 并查询另一个filed的sum,时间统计图,时间间隔是1天。

SELECT
DATE(create_at), fieldA, SUM(fieldB)
from table
group by DATE(create_at), fieldA;

对应的java code:

SearchRequestBuilder searchReq = client.prepareSearch("sample_index");
searchReq.setTypes("sample_types");
DateHistogramBuilder dhb = AggregationBuilders.dateHistogram("my_datehistogram").field("create_at").interval(DateHistogram.Interval.days(1));
TermsBuilder termsb_fa = AggregationBuilders.terms("my_fieldA").field("fieldA").size(100);
termsb_fa.subAggregation(AggregationBuilders.sum("my_sum_fieldB").field("fieldB"));
dhb.subAggregation(termsb_fa)searchReq.setQuery(QueryBuilders.matchAllQuery()).addAggregation(dhb);
SearchResponse searchRes = searchReq.execute().actionGet();DateHistogram dateHist = searchRes.getAggregations().get("my_datehistogram");
for (DateHistogram.Bucket dateBucket : dateHist.getBuckets()) {//DATE(create_at)String create_at = dateentry.getKey();Terms fieldATerms = dateBucket.getAggregations().get("my_fieldA");for (Terms.Bucket filedABucket : fieldATerms.getBuckets()) {//fieldAString fieldAValue = filedABucket.getKey();//SUM(fieldB)Sum sumagg = filedABucket.getAggregations().get("my_sum_fieldB");long sumFieldB = (long)sumagg.getValues();}
}

3. 按两个field group by并查询第三个filed的sum

SELECT
fieldA, fieldC, SUM(fieldB)
from table
group by fieldA, fieldC;

对应的java code:

SearchRequestBuilder searchReq = client.prepareSearch("sample_index");
searchReq.setTypes("sample_types");TermsBuilder termsb_fa = AggregationBuilders.terms("my_fieldA").field("fieldA").size(100);
TermsBuilder termsb_fc = AggregationBuilders.terms("my_fieldC").field("fieldC").size(50);termsb_fc.subAggregation(AggregationBuilders.sum("my_sum_fieldB").field("fieldB"));
termsb_fa.subAggregation(termsb_fc)searchReq.setQuery(QueryBuilders.matchAllQuery()).addAggregation(termsb_fa);
SearchResponse searchRes = searchReq.execute().actionGet();Terms fieldATerms = searchRes.getAggregations().get("my_fieldA");
for (Terms.Bucket filedABucket : fieldATerms.getBuckets()) {//fieldAString fieldAValue = filedABucket.getKey();Terms fieldCTerms = filedABucket.getAggregations().get("my_fieldC");for (Terms.Bucket filedCBucket : fieldCTerms.getBuckets()) {//fieldCString fieldCValue = filedCBucket.getKey();//SUM(fieldB)Sum sumagg = filedCBucket.getAggregations().get("my_sum_fieldB");long sumFieldB = (long)sumagg.getValues();}
}

4. 按某个filed group by 并查询count、sum 和 average

SELECT
fieldA, COUNT(fieldA), SUM(fieldB), AVG(fieldB)
from table
group by fieldA;

对应的java code:

SearchRequestBuilder searchReq = client.prepareSearch("sample_index");
searchReq.setTypes("sample_types");TermsBuilder termsb = AggregationBuilders.terms("my_fieldA").field("fieldA").size(100);
termsb.subAggregation(AggregationBuilders.sum("my_sum_fieldB").field("fieldB"));
termsb.subAggregation(AggregationBuilders.avg("my_avg_fieldB").field("fieldB"));searchReq.setQuery(QueryBuilders.matchAllQuery()).addAggregation(termsb);
SearchResponse searchRes = searchReq.execute().actionGet();
Terms fieldATerms = searchRes.getAggregations().get("my_fieldA");
for (Terms.Bucket filedABucket : fieldATerms.getBuckets()) {//fieldAString fieldAValue = filedABucket.getKey();//COUNT(fieldA)long fieldACount = filedABucket.getDocCount();//SUM(fieldB)Sum sumagg = filedABucket.getAggregations().get("my_sum_fieldB");long sumFieldB = (long)sumagg.getValues();//AVG(fieldB)Avg avgagg = filedABucket.getAggregations().get("my_avg_fieldB");double avgFieldB = avgagg.getValues();
}

5. 按某个field group by 并按另一个filed的Sum排序,获取前10

SELECT
fieldA, SUM(fieldB)
from table
WHERE fieldC = "hoge"
group by fieldA
order by SUM(fieldB) DESC
limit 10;

对应的java code:

QueryBuilder termsc = QueryBuilders.termQuery("fieldC","hoge");
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(termsc);
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("my_fieldA").field("fieldA").size(10);
aggregationBuilder.subAggregation(AggregationBuilders.sum("my_sum_fieldB").field("fieldB"));
aggregationBuilder.order(Order.aggregation("my_sum_fieldB", false));
SearchResponse searchResponse = client.prepareSearch("sample_index").setQuery(queryBuilder).addAggregation(aggregationBuilder).execute().actionGet();
Terms terms = searchResponse.getAggregations().get("my_fieldA");
for (Terms.Bucket entry : terms.getBuckets()) {String fieldAValue = entry.getKey().toString();Sum sumagg = entry.getAggregations().get("my_sum_fieldB");double fieldValue = sumagg.getValue();
}

代码在GitHub上:https://github.com/luxiaoxun/Code4Java

本文转自阿凡卢博客园博客,原文链接:http://www.cnblogs.com/luxiaoxun/p/6826211.html,如需转载请自行联系原作者

SQL to Elasticsearch java code相关推荐

  1. Java Code Convention Rules

    2019独角兽企业重金招聘Python工程师标准>>> Java Code Convention Rules Rules available in this category: Av ...

  2. 20 Very Useful Java Code Snippets

    2019独角兽企业重金招聘Python工程师标准>>> Following are few very useful Java code snippets for Java devel ...

  3. ElasticSearch Java Api(一) -创建索引

    ElasticSearch Java API官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/jav ...

  4. 一步到位,用SQL检索ElasticSearch

    在介绍MOQL的上一篇文章<SQL to ElasticSearch DSL>里,提到了如何将SQL语法转换为ElasticSearch DSL的用法.这期间还出现乌龙事件,就是最新的代码 ...

  5. SQL to ElasticSearch DSL

    众所周知ElasticSearch目前是一个应用最为广泛的分布式搜索与分析引擎,它的功能强大,能够已很高的性能访问大规模数据.它拥有强大的查询分析语法,能够完成模糊查询.精准查询及聚集计算等诸多功能的 ...

  6. Java SQL异常:java.sql.SQLException: Incorrect DATE value: ‘2021.02.31‘

    报错信息: Cause: java.sql.SQLException: Incorrect DATE value: '2021.02.31' ; uncategorized SQLException; ...

  7. Elasticsearch Java API 分组、聚合、嵌套相关查询

    Elasticsearch Java API 分组.聚合.嵌套相关查询 翼支付监控系统正使用es做后端存储,这边我们是将日志计算处理过后的数据通过kafka储存到es.选择用es作为数据储存端是考虑到 ...

  8. 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题

    在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中 ...

  9. 取java.sql.date日期_JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]...

    1.如何将java.util.Date转化为java.sql.Date? 转化: java.sql.Date sd; java.util.Date ud; //initialize the ud su ...

最新文章

  1. YOLOv5x6模型来了! 同样支持CPU上ONNX部署与推理
  2. 半监督学习下的高维图构建
  3. J2EE-RBAC权限管理
  4. 父类与子类之间的关系
  5. Echart折线图 柱状图
  6. 还是想继续写代码,不想这么快就去养猪~
  7. iOS强制切换横屏、竖屏
  8. html css模仿实例,HTML+CSS模仿大学网站主页
  9. pulsar 卸载数据到aws-s3
  10. 串口中断和定时器中断_启士 | 蓝桥杯单片机教程12 中断与定时器 (上)
  11. 删除华为电视鸿蒙系统,华为解决互联网电视痛点:鸿蒙系统首发设备欲屏蔽开机广告...
  12. 科学研究设计二:定量分析和定性分析
  13. Andorid通话自动录音
  14. 空间触觉学习法 啥都能同理可证!真的是有手就行
  15. 比特大陆裁员潮据称已波及整个BCH开发团队
  16. android 11 antutu AID64 等检测软件电池容量不匹配
  17. 推荐系统实战 --- 基于音乐播放推荐
  18. android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...
  19. element-ui中el-table组件的行号
  20. docker最全笔记速查,逻辑清晰

热门文章

  1. 图片像素、英寸、厘米之间的单位换算
  2. mysql nextval同步锁_mysql中实现类似oracle中的nextval函数
  3. 但并不从包含函数声明的接口派生_C++的虚函数和纯虚函数
  4. js增加属性_前端js基础2
  5. python tkinter选择路径控件_Python3 Tkinter选择路径功能的实现方法
  6. 争吵所达到的效果要_悟空:不要害怕争吵,有时候争吵一些不喜欢的事情也能创造和谐...
  7. python中json dumps_python中json.loads,dumps,jsonify使用
  8. phpMyAdmin 数据库添加int类型的值时默认设为唯一主键的问题解决
  9. SnackbarUtilDemo【Snackbar的封装类】
  10. 商品秒杀,防并发解决思路