1. 程式人生 > 其它 >ElasticSearch idea 聚合查詢

ElasticSearch idea 聚合查詢

package com.msb.mall.mallsearch;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.msb.mall.mallsearch.config.ElasticSearchConfiguration;
import lombok.Data;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;

@SpringBootTest
class MallSearchApplicationTests { @Autowired private RestHighLevelClient restHighLevelClient; @Test void contextLoads() { System.out.println("restHighLevelClient---->"+restHighLevelClient); } /** * 普通聚合 * GET /blank/_search * { * "query": {"match_all": {}}, * "aggs": { * "ageAgg": { * "terms": { * "field": "age", * "size": 10 * },"aggs": { * "balanceAvg": { * "avg": { * "field": "balance" * } * } * } * } * },"size": 0 * } * @throws IOException
*/ @Test void SearchIndexByAggregation() throws IOException { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("blank");//設定查詢的索庫 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //查詢blank下address中包含mill記錄 searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(0
);//查詢所有的 //計算blank 下年齡的分佈平均薪資 TermsAggregationBuilder field = AggregationBuilders.terms("ageAgg").field("age").size(10); //巢狀聚合 field.subAggregation(AggregationBuilders.avg("balanceAvg").field("balance")); searchSourceBuilder.aggregation(field); searchRequest.source(searchSourceBuilder); //如何執行檢索操作 SearchResponse response = restHighLevelClient.search(searchRequest, ElasticSearchConfiguration.COMMON_OPTIONS); //獲取檢索後的響應物件 我們要解析出我們關心的資料 System.out.println(response); } /** * GET /blank/_search * { * "query": {"match_all": {}}, * "aggs": { * "ageAgg": { * "terms": { * "field": "age", * "size": 10 * },"aggs": { * "balanceAgg1": { * "avg": { * "field": "balance" * } * } * } * },"balanceAgg2":{ * "avg": { * "field": "age" * } * } * },"size": 0 * } * @throws IOException */ @Test void SearchIndexByAggregation1() throws IOException { SearchRequest searchRequest = new SearchRequest().indices("blank");//設定查詢的索庫 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //查詢blank下address中包含mill記錄 searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(0);//查詢所有的 //計算blank 下年齡的分佈平均薪資 TermsAggregationBuilder field = AggregationBuilders.terms("ageAgg").field("age").size(10); field.subAggregation(AggregationBuilders.avg("balanceAgg1").field("balance")); searchSourceBuilder.aggregation(field); //聚合平均年齡 AvgAggregationBuilder balanceAggBuilder = AggregationBuilders.avg("balanceAgg2").field("age"); searchSourceBuilder.aggregation(balanceAggBuilder); searchRequest.source(searchSourceBuilder); //如何執行檢索操作 SearchResponse response = restHighLevelClient.search(searchRequest, ElasticSearchConfiguration.COMMON_OPTIONS); //獲取檢索後的響應物件 我們要解析出我們關心的資料 System.out.println(response); } @Test void SearchIndexByAddress() throws IOException { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("blank");//設定查詢的索庫 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //查詢blank下address中包含mill記錄 searchSourceBuilder.query(QueryBuilders.matchQuery("address", "mill")); /* searchSourceBuilder.from(); searchSourceBuilder.size(); searchSourceBuilder.aggregation();*/ searchRequest.source(searchSourceBuilder); //如何執行檢索操作 SearchResponse response = restHighLevelClient.search(searchRequest, ElasticSearchConfiguration.COMMON_OPTIONS); //獲取檢索後的響應物件 我們要解析出我們關心的資料 System.out.println("response----->"+response); } @Test void SearchIndex() throws IOException { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("blank");//設定查詢的索庫 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); /*searchSourceBuilder.query(); searchSourceBuilder.from(); searchSourceBuilder.size(); searchSourceBuilder.aggregation();*/ searchRequest.source(searchSourceBuilder); //如何執行檢索操作 SearchResponse response = restHighLevelClient.search(searchRequest, ElasticSearchConfiguration.COMMON_OPTIONS); //獲取檢索後的響應物件 我們要解析出我們關心的資料 System.out.println("response----->"+response); } /** * 測試儲存文件 */ @Test void saveIndex() throws IOException { IndexRequest indexRequest = new IndexRequest("system"); indexRequest.id("1"); //indexRequest.source("name","lcc","age","18","gender","男");//測試 文件屬性 User user = new User(); user.setName("lcc"); user.setAge(22); user.setGender(""); //用jackson中的物件轉換json資料 ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); indexRequest.source(json, XContentType.JSON); //執行操作 IndexResponse index = restHighLevelClient.index(indexRequest, ElasticSearchConfiguration.COMMON_OPTIONS); //提取有用的的返回資訊 System.out.println(index); } @Data class User{ private String name; private Integer age; private String gender; } }