福哥在给同福网增加全文搜索功能的时候碰着了一个需求,福哥想要调出“热门标签”列表,这个可以通过SQL语句的Group by来实现。但是福哥想通过ElasticSearch来完成,毕竟ES的实行效率要快很多,那么如何通过ElasticSearch来实现类似SQL的Group by语句的效果呢?
通过研究创造了在ElasticSearch里面可以利用aggregations来仿照SQL的Group by语句效果,它不仅仅可以仿照还有更强大的功能,我们来学习一下吧~~
首先我们先来一个例子,福哥要实现根据文档的作者ID进行分组,从而拿到一组作者ID列表。

SQL
SELECTauthorId,count()asdoc_countFROMdocsGROUPBYauthorIdLIMIT6
ES
{"from":0,"size":0,"aggs":{"gb_authorId":{"terms":{"field":"authorId","size":6}}}}
分组后排序
接下来我们再来一个例子,福哥要根据文档绑定的标签ID进行分组,然后再根据分组后的数量进行排序,从而得到一组文档最多的标签ID列表。
SQL
SELECTdt.tagId,count()asdoc_countFROMdocsdINNERJOINdoc_tagdtONd.docId=dt.docIdGROUPBYdt.tagIdORDERBYdoc_countLIMIT6
ES
{"from":0,"size":0,"aggs":{"gb_tagIds":{"terms":{"field":"tagIds","order":{"_count":"desc"},"size":6}}}}
可以创造一个有趣的事情,在SQL里面为了实现这个目的用到了关联表进行分组。但是在ES里面可以直接对数组属性进行分组处理,而且排序语句没有变革,这个真的是很爽啊~~
排序字段分组后的排序可以根据不同的依据进行排序,大家随着福哥来理解一下吧!
_term
根据分组的字段的值进行排序,便是Group by后面的字段
_count
根据分组文档的数量进行排序,便是SELECT里面的count()出来的数字
总结本日福哥给大家演示了在ES里通过aggs来实现SQL里的Group by的分组功能的效果,同样的分组目的利用ES可以得到更高的效率,这个在数量越大的时候效果越明显~~
https://m.tongfu.net/home/35/blog/513107.html