Elasticsearch-02-Java 调用API
1. ELK-6.3.1版本环境搭建
参考 https://www.cnblogs.com/dduo/p/14871203.html
2.maven Java 项目
2.0 项目结构
2.1 pom.xml中引入相关依赖
<!--Es服务器版本6.3.1 使用对应报错 org.elasticsearch.client.Request.<init>(Ljava/lang/String;Ljava/lang/String;)V 因此使用6.5.4--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.5.4</version> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions> </dependency> <!-- Client 包缺少一些东西,因此引入此包 可以具体查看ISSUE https://github.com/elastic/elasticsearch/issues/26959 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.5.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
2.2 准备测试数据
https://files-cdn.cnblogs.com/files/blogs/688336/resources.zip
数据说明: data中是准备往索引中插入的测试数据 mapping中是创建索引对应的mapping映射文件
2.3 客户端连接对象等工具类开发
public interface CommonData { String index = "sku"; String indexAlias = "sku_ali"; String esServer = "10.10.10.10"; Integer esPort = 9200; String schema = "http"; String[] showFields = {"skuName","price","spuId","skuDesc"}; String dataFile = "data/data.txt"; String mappingFile = "mapping/mapping.json" }
import io.netty.util.internal.StringUtil; import org.apache.http.HttpHost; import org.elasticsearch.client.IndicesClient; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.junit.Test; import static com.es.api.CommonData.*; /** * @Description: 0. 准备Elasticsearch的客户端连接 */ public class ClientApp { private static volatile RestHighLevelClient client = null; /* 组装Elasticsearch客户端 */ public static RestHighLevelClient getClient(String ip, Integer port) { if (client == null) { synchronized (ClientApp.class) { try { if(StringUtil.isNullOrEmpty(ip) && port == null){ client = new RestHighLevelClient( RestClient.builder( new HttpHost(esServer,esPort, schema) )); }else{ client = new RestHighLevelClient( RestClient.builder( new HttpHost(ip,port, schema) )); } } catch (Exception e) { e.printStackTrace(); } } } return client; } public static RestHighLevelClient getClient() { return getClient(null,null); } /* 测试获取ES客户端 */ @Test public void testClientGet(){ RestHighLevelClient client = getClient(); RestClient lowLevelClient = client.getLowLevelClient(); IndicesClient indices = client.indices(); } }
2.4 创建索引+插入测试数据
import io.netty.util.internal.StringUtil; import org.elasticsearch.action.admin.indices.alias.Alias; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.support.ActiveShardCount; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.junit.Test; import java.io.*; import java.text.SimpleDateFormat; import java.util.Random; import static com.es.api.ClientApp.*; import static com.es.api.CommonData.*; /** * @Description: 1. 创建索引+添加测试数据 */ public class IndexApiUseApp { /* 创建索引*/ public void createIndex(String indexName, String mapping, String alias) throws IOException { // 配置信息 使用建造者模式构建 Settings settings = Settings.builder() // 当前索引的shard分片数为1 .put("number_of_shards", 1) // 当前索引的副本数为1 .put("number_of_replicas", 1) .build(); CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName); // 除此之外还可以使用Map传递 createIndexRequest.settings(settings); // 设置超时时间 createIndexRequest.timeout(TimeValue.timeValueSeconds(5)); // 设置主节点超时时间 createIndexRequest.masterNodeTimeout(TimeValue.timeValueSeconds(5)); // 设置创建索引API返回响应之前等待活动分片的数量 createIndexRequest.waitForActiveShards(ActiveShardCount.from(1)); CreateIndexRequest createIndexRequest2 = new CreateIndexRequest(indexName, settings); // 设置mapping if (StringUtil.isNullOrEmpty(mapping)) { InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(mappingFile); byte[] datas = new byte[2048]; int a = 0; while ((a = resourceAsStream.read(datas)) != -1) {} String mapData = new String(datas); mapData = mapData.replaceAll("\t", "") .replaceAll("\r\n", "") .replaceAll("\n", "") .trim(); createIndexRequest.mapping("_doc", mapData, XContentType.JSON); } // 设置索引别名 if (StringUtil.isNullOrEmpty(alias)) { createIndexRequest.alias(new Alias(alias)); } // 执行创建请求 CreateIndexResponse createIndexResponse = getClient() .indices() .create(createIndexRequest, RequestOptions.DEFAULT); boolean acknowledged = createIndexResponse.isAcknowledged(); boolean shardsAcknowledged = createIndexResponse.isShardsAcknowledged(); String index = createIndexResponse.index(); System.out.println("acknowledged: " + acknowledged + ",shardsAcknowledged: " + shardsAcknowledged + ",index: " + index); } /*使用单元测试创建索引*/ @Test public void createIndexTest() { try { createIndex(index, "", indexAlias); } catch (IOException e) { e.printStackTrace(); } } /* 索引添加测试数据*/ @Test public void batchAdd() { String index = CommonData.index; try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(dataFile); BufferedReader bis = new BufferedReader(new InputStreamReader(resourceAsStream));) { // 读取data.txt数据并组装数据 String str = null; while ((str = bis.readLine()) != null) { XContentBuilder contentBuilder = XContentFactory.jsonBuilder(); contentBuilder.startObject(); // 第一行相当于是一个schema说明,需要过滤掉 if (str.startsWith("skuId")) { continue; } String[] arrs = str.split(","); contentBuilder.field("skuId", arrs[0]); contentBuilder.field("price", arrs[1]); contentBuilder.field("skuName", arrs[2]); contentBuilder.field("skuDesc", arrs[3]); contentBuilder.field("weight", arrs[4]); contentBuilder.field("spuId", arrs[5]); contentBuilder.field("catalog3Id", arrs[6]); contentBuilder.field("saleDate", arrs[7]); contentBuilder.field("skuDefaultImg", arrs[8]); contentBuilder.endObject(); // todo type不能少 IndexRequest indexRequest = new IndexRequest(index, "_doc").source(contentBuilder); IndexResponse indexResponse = getClient().index(indexRequest, RequestOptions.DEFAULT); System.out.println(indexResponse.getIndex()); contentBuilder.close(); } } catch (Exception e) { e.printStackTrace(); } }
2.5 Kibana上查看数据
方法一: 使用ES的API接口
方法二: 使用Kibana展示
ps: 之前没有date类型字段时好像是没有第6步操作
2.6 基础搜索相关功能使用
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.index.query.*; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import org.junit.Test; import java.io.IOException; import java.util.Map; import static com.es.api.ClientApp.*; import static com.es.api.CommonData.*; /** * @Description: 2. 使用搜索相关API */ public class SearchApiUseApp { /*搜索当前index全部数据 --默认查询前10条*/ public void searchAll(String index,String [] fields) throws IOException { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 获取指定字段 _id不属于当前索引mapping中定义字段,因此查询不出来 searchSourceBuilder.fetchSource(fields,null); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } @Test public void searchAllTest(){ try { searchAll(index,showFields); } catch (IOException e) { e.printStackTrace(); } } /*分页查询*/ public void pageQuery(String index,int from,int size,String[] fields) throws IOException { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.fetchSource(fields,null); // 指定分页查询起始点和长度 searchSourceBuilder.from(from); searchSourceBuilder.size(size); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } @Test public void pageQueryTest(){ try { pageQuery(index, 0, 20,showFields); } catch (IOException e) { e.printStackTrace(); } } /*ids查询 --根据ES给定的id查询*/ public void idsQuery(String index,String[] ids) throws IOException { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.idsQuery().addIds(ids)); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } @Test public void idsQueryTest(){ try { idsQuery(index, new String[]{"4k-fenoBVullmZMi8ona","4U-fenoBVullmZMi8onG","50-fenoBVullmZMi84ku"}); } catch (IOException e) { e.printStackTrace(); } } /* match匹配查询*/ @Test public void matchQuery() throws IOException { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // todo matchPhraseQuery精确匹配与matchQuery类模糊匹配的 searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("skuName","电脑_0212_C")); searchSourceBuilder.query(QueryBuilders.matchQuery("skuName","电脑_0212_C")); // multi_match多条件匹配 skuDefaultImg字段失败-mapping.json文件中没有将skuDefaultImg字段置为索引字段 searchSourceBuilder.query(QueryBuilders.multiMatchQuery("手机","skuName","skuDesc"));
// todo 以上三个不同的query测试哪个就将其余的注释掉 request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } public static void printResult(SearchResponse search) { SearchHits hit = search.getHits(); SearchHit[] hits = hit.getHits(); for (SearchHit documentFields : hits) { // System.out.println(documentFields.getSourceAsString()); Map<String, Object> sourceAsMap = documentFields.getSourceAsMap(); System.out.println(sourceAsMap); } } /*复杂查询-bool查询*/ @Test public void boolQuery(){ try { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.must( new MatchQueryBuilder("skuName","手机") ); boolQueryBuilder.filter(new RangeQueryBuilder("price").gte(80).lt(100)); searchSourceBuilder.query(boolQueryBuilder); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } catch (IOException e) { e.printStackTrace(); } } /*sort-排序使用*/ @Test public void sortQuery(){ try { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.fetchSource(showFields,null); // 综合使用: 按照bool条件查询+根据price排序+分页查询前100 BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.must( new MatchQueryBuilder("skuName","手机") ); boolQueryBuilder.filter(new RangeQueryBuilder("price").gte(80).lt(1000)); searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.sort("price", SortOrder.DESC); searchSourceBuilder.from(0); searchSourceBuilder.size(100); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } catch (IOException e) { e.printStackTrace(); } } }
2.7 分组聚合相关功能使用
package com.es.api; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.*; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.avg.Avg; import org.elasticsearch.search.aggregations.metrics.avg.AvgAggregationBuilder; import org.elasticsearch.search.aggregations.metrics.max.Max; import org.elasticsearch.search.aggregations.metrics.max.MaxAggregationBuilder; import org.elasticsearch.search.aggregations.metrics.min.Min; import org.elasticsearch.search.aggregations.metrics.min.MinAggregationBuilder; import org.elasticsearch.search.aggregations.metrics.sum.Sum; import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.junit.Test; import java.io.IOException; import java.util.List; import static com.es.api.ClientApp.*; import static com.es.api.CommonData.index; /** * @Description: 分组查询相关API使用 */ public class GroupSearchUseApp { /*根据指定字段分组求个数 */ @Test public void groupCountAgg() { SearchRequest request = new SearchRequest(index); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.size(0); sourceBuilder.query(QueryBuilders.matchAllQuery()); AggregationBuilder aggregationBuilder = AggregationBuilders .terms("spuId_group") .field("spuId"); sourceBuilder.aggregation(aggregationBuilder); request.source(sourceBuilder); try { SearchResponse aggResponse = getClient().search(request, RequestOptions.DEFAULT); Aggregations aggregations = aggResponse.getAggregations(); Terms terms = aggregations.get("spuId_group"); List<? extends Terms.Bucket> buckets = terms.getBuckets(); buckets.forEach(info -> System.out.println("spuId:" + info.getKey() + " count : " + info.getDocCount()); ); } catch (IOException e) { e.printStackTrace(); } } /*根据指定字段分组求均值 */ @Test public void groupAvgAgg() { SearchRequest request = new SearchRequest(index); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.size(0); sourceBuilder.query(QueryBuilders.matchAllQuery()); AggregationBuilder aggregationBuilder = AggregationBuilders .terms("cata_avg_price") .field("catalog3Id"); AvgAggregationBuilder avgAgg = AggregationBuilders .avg("avg_price") .field("price"); aggregationBuilder.subAggregation(avgAgg); sourceBuilder.aggregation(aggregationBuilder); request.source(sourceBuilder); try { SearchResponse aggResponse = getClient().search(request, RequestOptions.DEFAULT); Aggregations aggregations = aggResponse.getAggregations(); Terms terms = aggregations.get("cata_avg_price"); List<? extends Terms.Bucket> buckets = terms.getBuckets(); buckets.forEach(info -> { Aggregations subAggs = info.getAggregations(); Avg avg = subAggs.get("avg_price"); System.out.println("cateId:" + info.getKey() + " count : " + info.getDocCount() + " avg: " + avg.getValue()); }); } catch (IOException e) { e.printStackTrace(); } } /*根据指定字段分组求 价格平均值、最大值、最小值、总和*/ @Test public void groupMoreAgg() { SearchRequest request = new SearchRequest(index); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.size(0); sourceBuilder.query(QueryBuilders.matchAllQuery()); AggregationBuilder aggregationBuilder = AggregationBuilders .terms("cata_more_price") .field("catalog3Id"); AvgAggregationBuilder avgAgg = AggregationBuilders .avg("avg_price") .field("price"); MaxAggregationBuilder maxAgg = AggregationBuilders .max("max_price") .field("price"); MinAggregationBuilder minAgg = AggregationBuilders .min("min_price") .field("price"); SumAggregationBuilder sumAgg = AggregationBuilders .sum("sum_price") .field("price"); aggregationBuilder.subAggregation(avgAgg); aggregationBuilder.subAggregation(maxAgg); aggregationBuilder.subAggregation(minAgg); aggregationBuilder.subAggregation(sumAgg); sourceBuilder.aggregation(aggregationBuilder); request.source(sourceBuilder); try { SearchResponse aggResponse = getClient().search(request, RequestOptions.DEFAULT); Aggregations aggregations = aggResponse.getAggregations(); Terms terms = aggregations.get("cata_more_price"); List<? extends Terms.Bucket> buckets = terms.getBuckets(); buckets.forEach(info -> { Aggregations subAggs = info.getAggregations(); Avg avg = subAggs.get("avg_price"); Max max = subAggs.get("max_price"); Min min = subAggs.get("min_price"); Sum sum = subAggs.get("sum_price"); System.out.println("catalog3Id:" + info.getKey() + " count : " + info.getDocCount() + " avg: " + avg.getValue() + " " + "min: " + min.getValue() + " max: " + max.getValue() + " sum: " + sum.getValue()); }); } catch (IOException e) { e.printStackTrace(); } } /*根据不同价格区间统计 商品个数*/ @Test public void rangPriceQuery() { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 使用价格区间统计 HistogramAggregationBuilder histogramValuesSourceBuilder = AggregationBuilders .histogram("price_scope") .field("price") .interval(500); SumAggregationBuilder sumAggregationBuilder = AggregationBuilders .sum("sum_price") .field("price"); histogramValuesSourceBuilder.subAggregation(sumAggregationBuilder); searchSourceBuilder.aggregation(histogramValuesSourceBuilder); request.source(searchSourceBuilder); try { SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); Aggregations aggregations = search.getAggregations(); Histogram histogram = aggregations.get("price_scope"); List<? extends Histogram.Bucket> buckets = histogram.getBuckets(); buckets.forEach(info -> { Sum sum = info.getAggregations().get("sum_price"); System.out.println("id: " + info.getKey() + " count: " + info.getDocCount() + " sum: " + sum.getValue()); }); } catch (IOException e) { e.printStackTrace(); } } /*计算每天|周|月|季度|年的销售总额,并按照总额降序查询*/ @Test public void useDateAgg() { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); String flag = null; DateHistogramAggregationBuilder histogramAggregationBuilder = null; /* histogramAggregationBuilder = AggregationBuilders .dateHistogram("day_price") .field("saleDate") .dateHistogramInterval(DateHistogramInterval.DAY) .format("yyyy-MM-dd") .order(BucketOrder.aggregation("sum_price",false)); flag = "day";*/ histogramAggregationBuilder = AggregationBuilders .dateHistogram("week_price") .field("saleDate") .dateHistogramInterval(DateHistogramInterval.WEEK) .format("yyyy-MM-dd") .order(BucketOrder.aggregation("sum_price", false)); flag = "week"; /*histogramAggregationBuilder = AggregationBuilders .dateHistogram("q_price") .field("saleDate") .dateHistogramInterval(DateHistogramInterval.QUARTER) .format("yyyy-MM-dd") .order(BucketOrder.aggregation("sum_price", false)); flag = "q"; histogramAggregationBuilder = AggregationBuilders .dateHistogram("year_price") .field("saleDate") .dateHistogramInterval(DateHistogramInterval.YEAR) .format("yyyy-MM-dd") .order(BucketOrder.aggregation("sum_price", false)); flag = "year"; histogramAggregationBuilder = AggregationBuilders .dateHistogram("month_price") .field("saleDate") .dateHistogramInterval(DateHistogramInterval.MONTH) .format("yyyy-MM-dd") .order(BucketOrder.aggregation("sum_price",false)); flag = "month";*/ SumAggregationBuilder sumAggregationBuilder = AggregationBuilders .sum("sum_price") .field("price"); histogramAggregationBuilder.subAggregation(sumAggregationBuilder); searchSourceBuilder.aggregation(histogramAggregationBuilder); request.source(searchSourceBuilder); try { SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); Histogram histogram = null; switch (flag) { case "day": histogram = search.getAggregations().get("day_price"); break; case "month": histogram = search.getAggregations().get("month_price"); break; case "year": histogram = search.getAggregations().get("year_price"); break; case "q": histogram = search.getAggregations().get("q_price"); break; case "week": histogram = search.getAggregations().get("week_price"); break; } List<? extends Histogram.Bucket> buckets = histogram.getBuckets(); buckets.forEach(info -> { Sum sum = info.getAggregations().get("sum_price"); System.out.println("id: " + info.getKey() + " count: " + info.getDocCount() + " sum: " + sum.getValue()); }); } catch (IOException e) { e.printStackTrace(); } } }
2.8 Java Api方法对应Kibana操作命令
1. 创建索引 PUT sku { "settings": { "number_of_shards": 1, "number_of_replicas": 1 }, "mappings": { "SkuInfo":{ "properties": { "skuName":{ "type": "text", "analyzer": "ik_max_word", "index": true }, "price":{ "type": "double" }, "spuId":{ "type": "long" }, "weight":{ "type": "double" }, "catalog3Id":{ "type": "keyword" }, "skuDefaultImg":{ "type": "keyword", "index": false }, "skuDesc":{ "type": "text", "analyzer": "ik_smart" } } } }, "aliases": { "sku_alias": {} } } 2. 分页查询 GET /sku/_search { "query": { "match_all": {} }, "_source": ["skuName","price","spuId","skuDesc], "from": 0, "size": 20 } 3. ids查询 GET /sku/_search { "query": { "ids": { "values": ["4k-fenoBVullmZMi8ona","4U-fenoBVullmZMi8onG","50-fenoBVullmZMi84ku"] } } } 4. match匹配查询 todo 精确查出来一条数据 GET /sku/_search { "query": { "match":{ "skuName":{ "query": "电脑_0212_C", "operator": "and" } } } } 查询出来很多数据,默认operator是or操作 GET /sku/_search { "query": { "match": { "skuName": "电脑_0212_C" } } } 5. 多条件匹配match GET /sku/_search { "query": { "multi_match": { "query": "手机", "fields": ["skuName", "skuDesc"] } } } 6. 复杂查询—-bool :#filter不参与相关度评分 GET /sku/_search { "query": { "bool": { "must": [ { "match": { "skuName": "手机" } } ], "filter": { "range": { "price": { "gte": 80, "lte": 100 } } } } } } 7. sort-排序查询 GET /sku/_search { "query": { "bool": { "must": [ { "match": { "skuName": "手机" } } ], "filter": { "range": { "price": { "gte": 80, "lte": 100 } } } } }, "sort": [ { "price": { "order": "desc" } } ], "_source": ["skuName","price","spuId","skuDesc"], "from": 0, "size": 20 } 8. 分组求和操作--统计每个spu对应sku个数 GET /sku/_search { "size": 0, "aggs": { "spu_group": { "terms": { "field": "spuId" } } } } 9. 分组求平均值--统计每个spu对应评均价格 GET /sku/_search { "size": 0, "aggs": { "cate_group": { "terms": { "field": "catalog3Id" }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } } 10. 分组求平均值,最值,总和--统计每个spu对应评均价格 GET /sku/_search { "size": 0, "aggs": { "cate_group": { "terms": { "field": "catalog3Id" }, "aggs": { "avg_price": { "avg": { "field": "price" } }, "max_price":{ "max": { "field": "price" } }, "min_price":{ "min": { "field": "price" } }, "sum_price":{ "sum": { "field": "price" } } } } } } 11. 按照售价价格划分范围(500),算出每个区间的商品 GET /sku/_search { "size": 0, "aggs": { "price_scope": { "histogram": { "field": "price", "interval": 500 }, "aggs": { "sum_price": { "sum": { "field": "price" } } } } } } 12. 计算每天|周|月|季度|年的销售总额,并按照总额降序查询 GET /sku/_search { "size": 0, "aggs": { "day_price": { "date_histogram": { "field": "saleDate", "interval": "day", "format": "yyyy-MM-dd", "order": { "sum_price": "desc" } }, "aggs": { "sum_price": { "sum": { "field": "price" } } } } } } GET /sku/_search { "size": 0, "aggs": { "week_price": { "date_histogram": { "field": "saleDate", "interval": "week", "format": "yyyy-MM-dd", "order": { "sum_price": "desc" } }, "aggs": { "sum_price": { "sum": { "field": "price" } } } } } } GET /sku/_search { "size": 0, "aggs": { "month_price": { "date_histogram": { "field": "saleDate", "interval": "month", "format": "yyyy-MM-dd", "order": { "sum_price": "desc" } }, "aggs": { "sum_price": { "sum": { "field": "price" } } } } } } GET /sku/_search { "size": 0, "aggs": { "year_price": { "date_histogram": { "field": "saleDate", "interval": "year", "format": "yyyy-MM-dd", "order": { "sum_price": "desc" } }, "aggs": { "sum_price": { "sum": { "field": "price" } } } } } }