欢迎来到天天文库
浏览记录
ID:11724315
大小:111.50 KB
页数:14页
时间:2018-07-13
《23 lucene学习总结之七:lucene搜索过程解析(8)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、2.4、搜索查询对象2.4.4、收集文档结果集合及计算打分在函数IndexSearcher.search(Weight,Filter,int)中,有如下代码:TopScoreDocCollectorcollector=TopScoreDocCollector.create(nDocs,!weight.scoresDocsOutOfOrder());search(weight,filter,collector);returncollector.topDocs();2.4.4.1、创建结果文档收集器TopScoreDocCollectorcollector
2、=TopScoreDocCollector.create(nDocs,!weight.scoresDocsOutOfOrder());publicstaticTopScoreDocCollectorcreate(intnumHits,booleandocsScoredInOrder){ if(docsScoredInOrder){ returnnewInOrderTopScoreDocCollector(numHits); }else{ returnnewOutOfOrderTopScoreDocCollector(numHits); }}其根
3、据是否按照文档号从小到大返回文档而创建InOrderTopScoreDocCollector或者OutOfOrderTopScoreDocCollector,两者的不同在于收集文档的方式不同。2.4.4.2、收集文档号当创建完毕Scorer对象树和SumScorer对象树后,IndexSearcher.search(Weight,Filter,Collector)有以下调用:scorer.score(collector),如下代码所示,其不断的得到合并的倒排表后的文档号,并收集它们。publicvoidscore(Collectorcollector)
4、throwsIOException{ collector.setScorer(this); while((doc=countingSumScorer.nextDoc())!=NO_MORE_DOCS){ collector.collect(doc); }}InOrderTopScoreDocCollector的collect函数如下:publicvoidcollect(intdoc)throwsIOException{ floatscore=scorer.score(); totalHits++; if(score<=pqTop.score){
5、 return; } pqTop.doc=doc+docBase; pqTop.score=score; pqTop=pq.updateTop();}OutOfOrderTopScoreDocCollector的collect函数如下:publicvoidcollect(intdoc)throwsIOException{ floatscore=scorer.score(); totalHits++; doc+=docBase; if(score6、7、(score==pqTop.score&&doc>pqTop.doc)){ r8、eturn; } pqTop.doc=doc; pqTop.score=score; pqTop=pq.updateTop();}从上面的代码可以看出,collector的作用就是首先计算文档的打分,然后根据打分,将文档放入优先级队列(最小堆)中,最后在优先级队列中取前N篇文档。然而存在一个问题,如果要取10篇文档,而第8,9,10,11,12篇文档的打分都相同,则抛弃那些呢?Lucene的策略是,在文档打分相同的情况下,文档号小的优先。也即8,9,10被保留,11,12被抛弃。由上面的叙述可知,创建collector的时候,根据文档是否将按照文档号从9、小到大的顺序返回而创建InOrderTopScoreDocCollector或者OutOfOrderTopScoreDocCollector。对于InOrderTopScoreDocCollector,由于文档是按照顺序返回的,后来的文档号肯定大于前面的文档号,因而当score<=pqTop.score的时候,直接抛弃。对于OutOfOrderTopScoreDocCollector,由于文档不是按顺序返回的,因而当score10、大于,则抛弃,如果小于则入队列。2.4.4.3、打分计算BooleanScorer2的打分函数
6、
7、(score==pqTop.score&&doc>pqTop.doc)){ r
8、eturn; } pqTop.doc=doc; pqTop.score=score; pqTop=pq.updateTop();}从上面的代码可以看出,collector的作用就是首先计算文档的打分,然后根据打分,将文档放入优先级队列(最小堆)中,最后在优先级队列中取前N篇文档。然而存在一个问题,如果要取10篇文档,而第8,9,10,11,12篇文档的打分都相同,则抛弃那些呢?Lucene的策略是,在文档打分相同的情况下,文档号小的优先。也即8,9,10被保留,11,12被抛弃。由上面的叙述可知,创建collector的时候,根据文档是否将按照文档号从
9、小到大的顺序返回而创建InOrderTopScoreDocCollector或者OutOfOrderTopScoreDocCollector。对于InOrderTopScoreDocCollector,由于文档是按照顺序返回的,后来的文档号肯定大于前面的文档号,因而当score<=pqTop.score的时候,直接抛弃。对于OutOfOrderTopScoreDocCollector,由于文档不是按顺序返回的,因而当score10、大于,则抛弃,如果小于则入队列。2.4.4.3、打分计算BooleanScorer2的打分函数
10、大于,则抛弃,如果小于则入队列。2.4.4.3、打分计算BooleanScorer2的打分函数
此文档下载收益归作者所有