Lucene4.3进阶开发之柳暗花明( 六)
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1999154
上篇文章,散仙介绍了IndexWriter的作用,它的最大价值体现在对索引的创建,管理和维护上,通过与IndexWriterConfig这个配置管理类的组合,可以实现最佳的索引策略,当然前提是你得了解IndexWriterConfig里一些重要的参数的配置含义。
本篇文章散仙要介绍的是IndexSearcher这个类,这个类是Lucene在进行检索时必不可少的一个组件,可以称为是检索的入口,通过这个入口之后,我们就可以获取与我们检索的关键词相关的一系列Doc,然后我们就可以进行后续相关的业务处理。
所以我们经常会在代码里这样写:
private static final class SearcherCallableNoSort implements Callable<TopDocs> { private final Lock lock; private final IndexSearcher searcher; private final Weight weight; private final ScoreDoc after; private final int nDocs; private final HitQueue hq; private final LeafSlice slice; public SearcherCallableNoSort(Lock lock, IndexSearcher searcher, LeafSlice slice, Weight weight, ScoreDoc after, int nDocs, HitQueue hq) { this.lock = lock; this.searcher = searcher; this.weight = weight; this.after = after; this.nDocs = nDocs; this.hq = hq; this.slice = slice; } @Override public TopDocs call() throws IOException { final TopDocs docs = searcher.search(Arrays.asList(slice.leaves), weight, after, nDocs); final ScoreDoc[] scoreDocs = docs.scoreDocs; //it would be so nice if we had a thread-safe insert lock.lock(); try { for (int j = 0; j < scoreDocs.length; j++) { // merge scoreDocs into hq final ScoreDoc scoreDoc = scoreDocs[j]; if (scoreDoc == hq.insertWithOverflow(scoreDoc)) { break; } } } finally { lock.unlock(); } return docs; } }