周五因为在搜索引擎中要使用group by操作,原有的 count发似乎会出现很大的效率问题,所以也简单考虑了下groupby的实现,在sql里我猜想(我对这个算法完全没有概念),首先利用矩阵算法将所有的row排序好,然后以此顺序取出,然后再加入聚合函数count或者sum,也就是说在sql中实际上他是先把按groupby字段索引排序然后再进行数据聚合,最后再拉出需要的数据(这个猜想是基于group by字段需要索引得到的,不知道是否正确)
而在lucene中也是类似的状况,现在我们考虑lucene 大家知道在lucene中得到的结果集是hits,hits实际上和sql中的结果集recordset是一个概念的,即使你得到了一个数百万的结果集,数据也并没有立即从中拉出(这应该就是为什么表需要有主键的原因)。但lucene中有个问题,我无法得到一个多结果集,也就是说我无法得到一个按groupby排序的某个中间结果,我得到的只是输出,因此在group中我只能选择先将所有数据全部读出这条路,那么读出来的数据怎样groupby?我实现的是基于hash表的 数组遍历。是这样的过程:
hash<字段名,groupby结果集>  
groupby结果集<字段值,聚合值>
用这样的hash嵌套实现,算法中我只使用了一次hash循环,但比较大的伤害是,数据集似乎被从头到尾取了一次,会产生很多io,并且由于我的group和查询是一种并行算法,因此等于结果集被取出了两遍(目标中的group是类似taobao的产品列表的类别归类查询页面,所以group是一个独立结果集并非输出结果集),目前测试下来还没有感觉内存消耗有极其大的影响,但不知道在高负荷状态下的水平,因此还需要继续查看。
关于group的算法,如果有更好的办法和算法或者在lucene下有更好的解决方案欢请路过不要吝啬你的idea告诉我吧。


Tags - lucene , groupby , 算法

你可能感兴趣的:(sql,算法,搜索引擎,Lucene,idea)