代码日记--lucene3.0.1
程序员文章站
2022-03-05 12:56:30
...
/**
* Returns a DocIdSet with documents that should be
* permitted in search results.
*/
@Override
public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
final TermEnum enumerator = query.getEnum(reader);//把过滤好的数据倒排出来
try {
// if current term in enum is null, the enum is empty -> shortcut
if (enumerator.term() == null)
return DocIdSet.EMPTY_DOCIDSET;
// else fill into a OpenBitSet
//lucene3最大的改动之一就是使用了这个OpenBitSet。
//OpenBitSet在处理64位数据或32位方面有较大改进
//认真看了下。里面的fastget,fastset是重点方法。过滤结果用得比较多。
final OpenBitSet bitSet = new OpenBitSet(reader.maxDoc());
final int[] docs = new int[32]; //这个32估计改成64野没问题,最终决定在下面
final int[] freqs = new int[32];
TermDocs termDocs = reader.termDocs();
try {
int termCount = 0;
do {
Term term = enumerator.term();
if (term == null)
break;
termCount++;
termDocs.seek(term);
while (true) {
final int count = termDocs.read(docs, freqs);//这里决定了最终过滤出来的文档号
if (count != 0) {
for(int i=0;i<count;i++) {
bitSet.set(docs[i]);
}
} else {
break;
}
}
} while (enumerator.next());//重复循环
query.incTotalNumberOfTerms(termCount);//存过滤出来的term个数。
} finally {
termDocs.close();
}
return bitSet;
} finally {
enumerator.close();
}
}
lucene中MultiTermQueryWrapperFilter<Q extends MultiTermQuery>,TermRangeFilter过滤操作源代码。
这个过滤方法,个2.0版本的方法没多大改变,只是原来是返回BitSet,现在是OpenBitSet。日后再看看,这么改起什么重要作用~~
上一篇: Java RMI之HelloWorld篇
下一篇: Java RMI之HelloWorld篇