By jeffye, on June 23rd, 2009

Sent to you by Jeffye via Google Reader:
Lucene的检索优化(二)–Hits的改进
via 笨笨的小田园 by 笨笨 on 8/15/08
刚刚开始学Lucene,看的是Lucene in
Action。顺着看下去,很自然的就是使用Hits来访问Search的结果。但是使用起来,发现Search的速度是很快,不过如果结果很多的话(比如1W个),通过Hits访问所有的结果速度非常慢,就是简单地从每个结果中读一个Field,在我的机器上用了接近2分钟。因为我的应用索引的只是我的数据的两个域包含文本信息的域,我本希望通过Lucene查找出符合需求的数据ID,再通过ID去判断数据库中的其他域来决定最终的结果。这样连取ID就需要2分钟,我的应用可受不了。
第一个想到的方法是把我的全部数据域都做成Lucene的索引,然后全部通过Lucene去搜索。但是由于我的很多域是数字,全部转换成Lucene能接受的字符串,感觉性能不会好。另外如果我想针对搜索的结果做统计,也没法避免需要遍历全部的搜索结果,如果1W个结果就需要2分钟的话,就算不用处理其他的域,也是不能忍受的。
开源软件的好处就是可以读代码。通过阅读Hits的代码,终于找到了解决问题的办法。
Lucene
的代码看起来并不是特别Professional。比如下面这两个Hits的初始化函数。首先里面的q,s,f什么的让人看起来就不是太舒服(其他的代码里还用i,j做循环变量)。其次这两个函数只有o那一个赋值不一样,明显应该只写一个,让另一个来调用。最后程序里面直接用了50这个常数,编程的大忌。(50在其他函数里面也有)
Hits(Searcher s, Query q, Filter f) throws IOException {
weight =
q.weight(s);
searcher =
s;
filter =
f;
nDeletions =
countDeletions(s);
getMoreDocs(50); // retrieve 100 initially
lengthAtStart = length;
}
Hits(Searcher s, Query q, Filter f, Sort o)
throws IOException {
weight =
q.weight(s);
searcher =
s;
filter =
f;
sort =
o;
[...]