1. 程式人生 > >SQL to Java code for Elasticsearch

SQL to Java code for Elasticsearch

Elasticsearch雖然定位為Search Engine,但是因其可以持久化資料,很多時候,我們把Elasticsearch當成Database用,但是Elasticsearch不支援SQL,就需要把SQL邏輯轉換成程式碼實現對應的功能。

以下列舉了一些常用的SQL轉換成對應的Java程式碼。

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()) { //fieldA String 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()) {
        //fieldA
        String 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()) {
    //fieldA
    String fieldAValue = filedABucket.getKey();
    Terms fieldCTerms = filedABucket.getAggregations().get("my_fieldC");
    for (Terms.Bucket filedCBucket : fieldCTerms.getBuckets()) {
        //fieldC
        String 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()) {
    //fieldA
    String 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();
}

相關推薦

SQL to Java code for Elasticsearch

Elasticsearch雖然定位為Search Engine,但是因其可以持久化資料,很多時候,我們把Elasticsearch當成Database用,但是Elasticsearch不支援SQL,就需要把SQL邏輯轉換成程式碼實現對應的功能。 以下列舉了一些常用的SQL轉換成對應的Java程式碼。 1.

SQL to Elasticsearch java code

elastics 不支持 sam double group index date days database 把Elasticsearch當成Database用,因為Elasticsearch不支持SQL,就需要把SQL轉換成代碼實現。 1.按某個field group

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

roo 存在 body 情況 方式 post 重啟 cal java   在myeclipse上面更改項目名後,重新登錄出現java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using pas

java.sql.SQLException: Access denied for user 'roo'@'localhost' (using password: YES)

navicat generate 幹凈 catch conn 數據 折騰 forname mys 初學mysql,安裝了mysql8.0.11,激動的用jdbc連接數據庫,出現error,折騰了三天依舊無解,最後無奈裝了比較穩定的mysql5.5,問題得以解決,很迷,但只要

Caused by: java.sql.SQLException: Access denied for user 'dell-pc'@'xxxxx' (using password: YES)

今天遇到一個非常坑的異常。 在做SSM專案整合的時候,遇到了上面這個異常,我一看連線資料庫的username 怎麼變成了 dell-pc,然而jdbc.properties : username=root password=123456 spring配置為: <?

ssm專案中報 java.sql.SQLException: Access denied for user '????…§'@'localhost' (using password: YES)

資料來源配置 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mvcdemo?useSSL=false username=root jdbc.password=root jdbc.initi

Failed to find byte code for * "問題導致Instant Run失敗問題解決

1 . project’s build.gradle 修改  com.android.tools.build:gradle:3.1.0  ->  com.android.tools.build:gradle:3.0.1 2 . gradle-wr

MySQL報錯:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

1、使用者名稱密碼錯誤 開啟命令視窗,進入MySQL的bin目錄,一般是在C:\Program Files\MySQL\MySQL Server 5.7\bin,輸入命令: mysql -u [username] -p 如果能進不去,則是使用者名稱密碼錯誤。如果能進

max file descriptors [65535] for elasticsearch process likely too low, increase to at least [65536]

更改普通使用者最大開啟檔案數不好使? 1、啟動es的時候,報錯,按照網上的大部分文章,都是改/etc/security/limits.conf *    hard    nofile    65536 *    soft    nofile    65536 *    so

java.sql.SQLException: Access denied for user '''localhost' (using password: NO) 的處理方法

報錯內容: java.sql.SQLException: Access denied for user '''localhost' (using password: NO)  原因: 我用的是springboot框架,application.yml檔案中的 sprin

Caused by: java.sql.SQLException: Access denied for user 'root'@'host' (using password: YES)

解決辦法: 1. SELECT * FROM mysql.user WHERE USER='root'; 2. GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.107.61' IDENTIFIED BY 'root'; 3. FLUS

Ask HN: Is it common for programmers to use code without license or attribution?

My understanding is there are open source or otherwise free code to use, and there is also code that is not licensed for use. Is it common to see the latte

Top 5 Free Java Courses for Beginners to Learn Online

We all love free resources, don't you? There was a time when I buy a lot of books when I was preparing for my engineering entrance exam but I only ended u

On Learning to Code (for 2019)

1. The initial programming language(s) you learn should align with your goalsYou’ll sometimes see senior engineers encourage others to try and first learn

Top 5 Websites to Learn Coding in Java Online for FREE

Begin an author of a Java blog, I often receive questions like how to improve my coding skills?,  or how do I learn to code in Java?, or I am having diffi

Top 5 Selenium Webdriver with Java Courses for Testers and Developers to Learn Online

The days of manual testing is limited as more and more companies are shifting towards automation testing. This means all manual testing QAs needs to learn

Java Code To Byte Code

Understanding how Java code is compiled into byte code and executed on a Java Virtual Machine (JVM) is critical because it helps you understand wh

java筆記)ClassCastException: java.util.Date cannot be cast to java.sql.Date

目的 根據oracle資料庫中的一個日期欄位,利用Java程式碼自動更新資料庫中的資料。 難點 資料庫中的資料欄位為 LEASEDAY | DATE型別 在java這邊的條件為字串日期 yyyy-mm-dd | String型別 由

Top 5 Spring Boot Courses to Learn Online for Java Developers in 2018

Hello guys, if you are interested in learning Spring Boot and looking for some awesome resources e.g. books, tutorials, and online courses to start with t