SQL to Elasticsearch java code

news/2024/7/5 8:43:28

把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,如需转载请自行联系原作者



http://lihuaxi.xjx100.cn/news/239675.html

相关文章

调试代码遗留_陷入遗留代码地狱吗? 这里有一些想法可以帮助您处理情况

调试代码遗留by Felipe Lopes通过Felipe Lopes 陷入遗留代码地狱吗&#xff1f; 这里有一些想法可以帮助您处理情况 (Stuck in legacy code hell? Here are some few thoughts to help you manage the situation) I’m gonna tell you a little story about how I ended up i…

apache开启虚拟主机 并进行配置

sudo vi /etc/apache2/httpd.conf 进入 apache 配置文件 在配置文件中搜索 Virtual hosts 如图 把前面的#删掉 #为注释 sudo vi /etc/apache2/extra/httpd-vhosts.conf 打开虚拟主机配置文件对下面的一下代码进行复制并粘贴在下方并更改里面的一些内容 DocumentRoot …

魅族手机使用鸿蒙系统,魅族宣布接入华为鸿蒙系统,这应该是黄章最正确的决定...

安卓能有现在的成就一切源于苹果之外其它所有品牌都在使用&#xff0c;俗话讲“众人拾柴火焰高”就是这个道理。相对来讲华为鸿蒙要想做大做强必须有其它品牌支持才可以&#xff0c;如果华为自己一家使用是无法做到与苹果的iOS、谷歌的安卓相抗衡的。这就是为什么华为鸿蒙正式确…

DOCKER OVERLAY NETWORK consul 注册

下载 consul 二进制包并启动 wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip unzip consul_0.9.2_linux_amd64.zip mv consul /usr/bin/consul && chmod x /usr/bin/consul nohup consul agent -server -bootstrap -ui -data-dir /va…

Unique Paths II

注意一个容易犯的错误&#xff1a;判断obstacleGrid是否为1时&#xff0c;else那部分不能少。因为如果不加&#xff0c;就会默认把那些值设置为0。 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int height ob…

uber_Uber是如何制成的

uberby Dmytro Brovkin由Dmytro Brovkin Uber是如何制成的 (How Uber was made) Uber has transformed the world. Indeed, its inconceivable to think of a world without the convenience of the innovative ride sharing service. Tracing its origins in a market which …

2021年甘肃省副高考试成绩查询,2021年甘肃卫生资格考试成绩查询-中国卫生人才网...

国家卫生资格考试网为您发布 2021年甘肃卫生资格考试成绩查询-中国卫生人才网&#xff0c;同步中国卫生人才网信息&#xff1a;2021甘肃卫生资格成绩查询。更多关于卫生资格成绩,卫生资格考试,2021卫生资格考试,国家卫生资格成绩查询的信息内容&#xff0c;请关注国家卫生资格考…

怎么写shell脚本才能不耍流氓?

1、不记录日志的 SHELL 脚本就是耍流氓&#xff01; 我们经常在工作中会遇到一个苦恼的事情&#xff0c;一个 Shell 脚本到底干了什么&#xff0c;什么时候开始执行&#xff0c;什么时候结束的。尤其是数据库备份&#xff0c;我们想知道我们的 MySQL 数据库备份时间。所以给脚本…