|
8 | 8 | import org.elasticsearch.action.bulk.BulkRequest; |
9 | 9 | import org.elasticsearch.action.search.SearchRequest; |
10 | 10 | import org.elasticsearch.action.search.SearchResponse; |
| 11 | +import org.elasticsearch.action.support.IndicesOptions; |
11 | 12 | import org.elasticsearch.action.update.UpdateRequest; |
12 | 13 | import org.elasticsearch.client.RequestOptions; |
13 | 14 | import org.elasticsearch.client.RestClient; |
14 | 15 | import org.elasticsearch.client.RestClientBuilder; |
15 | 16 | import org.elasticsearch.client.RestHighLevelClient; |
16 | 17 | import org.elasticsearch.common.xcontent.XContentType; |
| 18 | +import org.elasticsearch.index.query.BoolQueryBuilder; |
| 19 | +import org.elasticsearch.index.query.QueryBuilders; |
17 | 20 | import org.elasticsearch.rest.RestStatus; |
| 21 | +import org.elasticsearch.script.Script; |
18 | 22 | import org.elasticsearch.search.aggregations.Aggregation; |
19 | 23 | import org.elasticsearch.search.aggregations.AggregationBuilder; |
20 | 24 | import org.elasticsearch.search.aggregations.AggregationBuilders; |
|
23 | 27 | import org.elasticsearch.search.aggregations.bucket.terms.Terms; |
24 | 28 | import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; |
25 | 29 | import org.elasticsearch.search.aggregations.metrics.avg.Avg; |
| 30 | +import org.elasticsearch.search.aggregations.metrics.cardinality.CardinalityAggregationBuilder; |
26 | 31 | import org.elasticsearch.search.aggregations.metrics.max.Max; |
27 | 32 | import org.elasticsearch.search.aggregations.metrics.min.Min; |
28 | 33 | import org.elasticsearch.search.aggregations.metrics.sum.Sum; |
29 | 34 | import org.elasticsearch.search.aggregations.metrics.tophits.TopHits; |
| 35 | +import org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders; |
| 36 | +import org.elasticsearch.search.aggregations.pipeline.bucketselector.BucketSelectorPipelineAggregationBuilder; |
30 | 37 | import org.elasticsearch.search.builder.SearchSourceBuilder; |
31 | 38 | import org.slf4j.Logger; |
32 | 39 | import org.slf4j.LoggerFactory; |
@@ -393,6 +400,28 @@ private static void agg(Map<String,Object> map, List<Map<String,Object>> list, A |
393 | 400 | }); |
394 | 401 | } |
395 | 402 |
|
| 403 | + private static void agg(List<Map<String, Object>> list, Aggregations aggregations) { |
| 404 | + aggregations.forEach(aggregation -> { |
| 405 | + String name = aggregation.getName(); |
| 406 | + Terms genders = aggregations.get(name); |
| 407 | + for (Terms.Bucket entry : genders.getBuckets()) { |
| 408 | + String key = entry.getKey().toString(); |
| 409 | + long t = entry.getDocCount(); |
| 410 | + Map<String,Object> map =new HashMap<>(); |
| 411 | + map.put(name,key); |
| 412 | + map.put(name+"_"+"count",t); |
| 413 | + //判断里面是否还有嵌套的数据 |
| 414 | + List<Aggregation> list2 = entry.getAggregations().asList(); |
| 415 | + if (list2.isEmpty()) { |
| 416 | + list.add(map); |
| 417 | + }else{ |
| 418 | + agg(list, entry.getAggregations()); |
| 419 | + } |
| 420 | + } |
| 421 | + }); |
| 422 | + System.out.println(list); |
| 423 | + } |
| 424 | + |
396 | 425 |
|
397 | 426 |
|
398 | 427 | private static SearchResponse search(AggregationBuilder aggregation) throws IOException { |
@@ -473,6 +502,99 @@ protected static void agg(AggregationBuilder aggregation, String agg, String b |
473 | 502 | } |
474 | 503 | } |
475 | 504 |
|
| 505 | + /** |
| 506 | + * @Author pancm |
| 507 | + * @Description having |
| 508 | + * @Date 2020/8/21 |
| 509 | + * @Param [] |
| 510 | + * @return void |
| 511 | + **/ |
| 512 | + private static void havingSearch() throws IOException{ |
| 513 | + String index=""; |
| 514 | + SearchRequest searchRequest = new SearchRequest(index); |
| 515 | + searchRequest.indices(index); |
| 516 | + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); |
| 517 | + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); |
| 518 | + searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen()); |
| 519 | + String alias_name = "nas_ip_address_group"; |
| 520 | + String group_name = "nas_ip_address"; |
| 521 | + String query_name = "acct_start_time"; |
| 522 | + String query_type = "gte,lte"; |
| 523 | + String query_name_value="2020-08-05 13:25:55,2020-08-20 13:26:55"; |
| 524 | + String[] query_types= query_type.split(","); |
| 525 | + String[] query_name_values= query_name_value.split(","); |
| 526 | + |
| 527 | + for (int i = 0; i < query_types.length; i++) { |
| 528 | + if("gte".equals(query_types[i])){ |
| 529 | + boolQueryBuilder.must(QueryBuilders.rangeQuery(query_name).gte(query_name_values[i])); |
| 530 | + } |
| 531 | + if("lte".equals(query_types[i])){ |
| 532 | + boolQueryBuilder.must(QueryBuilders.rangeQuery(query_name).lte(query_name_values[i])); |
| 533 | + } |
| 534 | + } |
| 535 | + |
| 536 | + AggregationBuilder aggregationBuilder = AggregationBuilders.terms(alias_name).field(group_name).size(Integer.MAX_VALUE); |
| 537 | + |
| 538 | + //声明BucketPath,用于后面的bucket筛选 |
| 539 | + Map<String, String> bucketsPathsMap = new HashMap<>(8); |
| 540 | + bucketsPathsMap.put("groupCount", "_count"); |
| 541 | + //设置脚本 |
| 542 | + Script script = new Script("params.groupCount >= 1000"); |
| 543 | + //构建bucket选择器 |
| 544 | + BucketSelectorPipelineAggregationBuilder bs = |
| 545 | + PipelineAggregatorBuilders.bucketSelector("having", bucketsPathsMap, script); |
| 546 | + aggregationBuilder.subAggregation(bs); |
| 547 | + sourceBuilder.aggregation(aggregationBuilder); |
| 548 | + //不需要解释 |
| 549 | + sourceBuilder.explain(false); |
| 550 | + //不需要原始数据 |
| 551 | + sourceBuilder.fetchSource(false); |
| 552 | + //不需要版本号 |
| 553 | + sourceBuilder.version(false); |
| 554 | + sourceBuilder.query(boolQueryBuilder); |
| 555 | + searchRequest.source(sourceBuilder); |
| 556 | + |
| 557 | + |
| 558 | + System.out.println(sourceBuilder); |
| 559 | + // 同步查询 |
| 560 | + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); |
| 561 | + // 查询条数 |
| 562 | + long count = searchResponse.getHits().getHits().length; |
| 563 | + Aggregations aggregations = searchResponse.getAggregations(); |
| 564 | +// agg(aggregations); |
| 565 | + Map<String,Object> map =new HashMap<>(); |
| 566 | + List<Map<String,Object>> list =new ArrayList<>(); |
| 567 | + agg(list,aggregations); |
| 568 | +// System.out.println(map); |
| 569 | + System.out.println(list); |
| 570 | + } |
| 571 | + |
| 572 | + |
| 573 | + /** |
| 574 | + * @Author pancm |
| 575 | + * @Description 去重 |
| 576 | + * @Date 2020/8/26 |
| 577 | + * @Param [] |
| 578 | + * @return void |
| 579 | + **/ |
| 580 | + private static void distinctSearch() throws IOException{ |
| 581 | + String buk="group"; |
| 582 | + String distinctName="name"; |
| 583 | + AggregationBuilder aggregation = AggregationBuilders.terms("age").field("age"); |
| 584 | + CardinalityAggregationBuilder cardinalityBuilder = AggregationBuilders.cardinality(distinctName).field(distinctName); |
| 585 | + //根据创建时间按天分组 |
| 586 | +// AggregationBuilder aggregation3 = AggregationBuilders.dateHistogram("createtm") |
| 587 | +// .field("createtm") |
| 588 | +// .format("yyyy-MM-dd") |
| 589 | +// .dateHistogramInterval(DateHistogramInterval.DAY); |
| 590 | +// |
| 591 | +// aggregation2.subAggregation(aggregation3); |
| 592 | + aggregation.subAggregation(cardinalityBuilder); |
| 593 | + agg(aggregation,buk); |
| 594 | + } |
| 595 | + |
| 596 | + |
| 597 | + |
476 | 598 | private static void topSearch() throws IOException{ |
477 | 599 |
|
478 | 600 |
|
|
0 commit comments