关于group by

[不指定 2008/03/22 10:30 | by edwardproAdmin ]
| |

周五因为在搜索引擎中要使用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告诉我吧。

技术私语 | 评论(2) | 引用(0) | 阅读(825)
edwardpro
2008/08/02 22:35
感谢提供思路啊! 突然有了个高级思路,呵呵
二托 Email
2008/08/02 11:47
淘宝的产品分组是用yahoo的isearch开发,我问了他们的分组也是采用最结果集遍历的方式,淘宝的索引即可以分组,而且只是对几个简单字段索引,并没有全文,我问了他们的一个构架师,他们说iserch分组的时候,全部加载到内存了,没有io操作,我觉得哪个方式不好。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]