您的位置:首页 > 其它

Lucene 如何实现高性能 GroupBy <二>

2010-11-30 17:12 441 查看
紧接上一篇 Lucene 如何实现高性能GroupBy <一> 的讲:Lucene--Util--PriorityQueue.cs

先给大家看一段代码,来源于PriorityQueue类

DownHeap

private void  DownHeap()
{
int i = 1;
System.Object node = heap[i]; // save top node
int j = i << 1; // find smaller child
int k = j + 1;
if (k <= size && LessThan(heap[k], heap[j]))
{
j = k;
}
while (j <= size && LessThan(heap[j], node))
{
heap[i] = heap[j]; // shift up child
i = j;
j = i << 1;
k = j + 1;
if (k <= size && LessThan(heap[k], heap[j]))
{
j = k;
}
}
heap[i] = node; // install saved node
}


这里用到了移位运算,用以快速的将heap中的分数进行排列,每一次的排列都会将分数最小的值放在heap[1]位置,用以返回,在Collect方法如果发现Doc对应的Score比heap中最小的分数还小时,就不再进行高低分排序。

我们前面说到,同一公司分数低的被同一公司分数高的替换掉再进行高低分排序时我们要注意了,移位起始值就不再是1了,而是被替换值在heap中的位置,所以我们还需要重载一下DownHeap方法,这些都很简单了,都是一些具体的实现方式了,原本想把实际的代码公布出来,但是考虑到里面有很多是根据具体需求来写的,懒得改代码了,这里也就不再公开具体代码,即然明白了原理,而且公布了一些比较关键地方的代码,我想实现起来应该没有什么大问题了,如果有其它疑问,可以以评论的方式来出现,欢迎大家来拍砖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: