ElasticSearch聚合查询小例子

  工作需要,专门花了一下午研究了Elasticsearch里面的nested。最好的材料还是官网上面的Elasticsearch: The Definitive Guide

所以直接将里面涉及到nested的文章找来看了看,顺便把它们翻译了,贴出来和大家分享。同时综合考虑了一下,把英语大体的

英文原文也一起贴出来了。希望这样能够适应不同读者的口味。

     1.Elasticsearch之Nested Object

    2.Elasticsearch之Nested Object Mapping 

    3.Elasticsearch之Nested Query

    4.Elasticsearch之Nested Sorting

    5.Elasticsearch之Nested Aggregation 

   备注:nested在5篇文章内特意没有翻译。毕竟在你不能在编程的时候将nested写成“嵌套”。其他一些比如,object,

document的翻译,个人是不喜欢翻译成中文的。不过文章中大多数地方还是将他们分别翻译成对象和文本。

 

 

在ES里面所有的聚合实例都由AggregationBuilders类提供静态方法构造,我们先看下常用有哪些方法使用: 
 

Java代码 

 收藏代码

  1. (1)统计某个字段的数量  
  2.   ValueCountBuilder vcb=  AggregationBuilders.count("count_uid").field("uid");  
  3. (2)去重统计某个字段的数量(有少量误差)  
  4.  CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");  
  5. (3)聚合过滤  
  6. FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));  
  7. (4)按某个字段分组  
  8. TermsBuilder tb=  AggregationBuilders.terms("group_name").field("name");  
  9. (5)求和  
  10. SumBuilder  sumBuilder= AggregationBuilders.sum("sum_price").field("price");  
  11. (6)求平均  
  12. AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");  
  13. (7)求最大值  
  14. MaxBuilder mb= AggregationBuilders.max("max_price").field("price");   
  15. (8)求最小值  
  16. MinBuilder min= AggregationBuilders.min("min_price").field("price");  
  17. (9)按日期间隔分组  
  18. DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");  
  19. (10)获取聚合里面的结果  
  20. TopHitsBuilder thb=  AggregationBuilders.topHits("top_result");  
  21. (11)嵌套的聚合  
  22. NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");  
  23. (12)反转嵌套  
  24. AggregationBuilders.reverseNested("res_negsted").path("kps ");  



上面这些基本就是常用的聚合查询了,在嵌套(nested)下面的子聚合查询就是嵌套查询了,除了嵌套查询,其他的聚合查询也可以无限级添加子查询 

举一个二级分组的例子: 

Java代码 

 收藏代码

  1. SearchRequestBuilder search = client.prepareSearch("index").setTypes("type");  
  2.   
  3. TermsBuilder one=  AggregationBuilders.terms("group_name").field("name");  
  4. TermsBuilder two=  AggregationBuilders.terms("group_age").field("age");  
  5. one.subAggregation(two)  
  6. search.addAggregation(one);  
  7.   
  8.   
  9.     Terms terms= search.get().getAggregations().get("group_name");  
  10.         for(Terms.Bucket name_buk:terms.getBuckets()){  
  11.             //一级分组的内容  
  12.             Terms terms_age= name_buk.getAggregations().get("group_age");  
  13.             for(Terms.Bucket age_buk:terms_age.getBuckets()){  
  14.                 //二级分组的内容     
  15.                 System.out.println(name_buk.getKey()+"  "+age_buk.getKey()+"  "+age_buk.getDocCount());  
  16.   
  17.             }  
  18. }  



注意上面的例子 ,二级子查询可以添加多种类型,比如第一级按照名字分组,第二级可以添加一个max或者min的子聚合查询。 

下面看一个嵌套聚合的例子: 

Java代码 

 收藏代码

  1. -           //嵌套查询root节点  
  2.         NestedBuilder nestedBuilder= AggregationBuilders.nested("negsted").path("quests");  
  3.         //嵌套查询的子查询中分组count  
  4.         TermsBuilder tb=  AggregationBuilders.terms("group_name").field("quests.name");  
  5.          //添加子查询到root节点里面  
  6.         nestedBuilder.subAggregation(tb);  
  7.         //获取一级嵌套  
  8.         Nested ntd= search.get().getAggregations().get("negsted");  
  9.         //打印一级嵌套的结果  
  10.         System.out.println(ntd.getDocCount());  
  11.         //从一级嵌套查询的结果中获取二级嵌套查询结果  
  12.         Terms term=     ntd.getAggregations().get("group_name");  
  13.         //获取嵌套下面的结果  
  14.         for(Terms.Bucket tbket:term.getBuckets()){  
  15.             System.out.println(tbket.getKey()+"  "+tbket.getDocCount());  
  16.         }  






嵌套的查询功能非常丰富,此外还有更强大Pipeline Aggregations聚合可以对上层的嵌套结果继续做操作,例如sql里面的having功能也可以实现,本篇简单的介绍了es的聚合查询的种类和简单使用,感兴趣的朋友可以通过官网详细学习下。 

 

https://blog.csdn.net/allenalex/article/details/45044425

http://qindongliang.iteye.com/blog/2363929

 

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html

转载于:https://my.oschina.net/xiaominmin/blog/1844618

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值