博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ElasticSearch聚合查询小例子
阅读量:6620 次
发布时间:2019-06-25

本文共 3102 字,大约阅读时间需要 10 分钟。

hot3.png

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

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

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

    

    2. 

    

   

     

   备注: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

你可能感兴趣的文章
大数据IMF-L38-MapReduce内幕解密听课笔记及总结
查看>>
eclipse主题颜色配置
查看>>
运维的85条规则
查看>>
2015年10月26日作业
查看>>
项目质量管理与人力资源管理要点梳理
查看>>
4月20日 项目管理作业
查看>>
ssh登录
查看>>
编译安装php无法解析
查看>>
mysql主从复制及维护--单主、双主
查看>>
saltstack之top及highstate命令和highdata lowdata
查看>>
linux学习笔记第五篇
查看>>
安卓学习-Camera,音频录制与Vitamio框架
查看>>
Android快速发布项目到jcenter
查看>>
Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇
查看>>
Spring自动化装配bean
查看>>
rsync 启停脚本
查看>>
Redis数据操作--散列键
查看>>
nginx--学习总结
查看>>
gradle:failed to find Build Tools revision 23.0.1
查看>>
博客类网站排名
查看>>