Hadoop MapReduce 上利用Lucene实现分布式检索
前一篇文章(Hadoop MapReduce 上利用Lucene实现分布式检索)中介绍了如何在HDFS上利用建立分布式索引,本文将举例说明如何使用Lucene进行分布式的检索。
package hdfs.luceneSearch; import java.io.IOException; import org.apache.lucene.document.Document; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; public class LuceneHDFSSearcher { private IndexReader reader; private IndexSearcher searcher; public LuceneHDFSSearcher(FsDirectory dir) throws CorruptIndexException, IOException{ reader = IndexReader.open(dir); searcher = new IndexSearcher(reader); } public Document search(String value) throws CorruptIndexException, IOException{ Query query = null; Term term = new Term("key",value); query = new TermQuery(term); Document doc = null; TopDocs hits = searcher.search(query,1); for(ScoreDoc scoreDoc:hits.scoreDocs){ doc = searcher.doc(scoreDoc.doc); } return doc; } public void close() throws IOException{ // 关闭对象 searcher.close(); reader.close(); } }
可以看出,该检索方法和单机进行Lucene检索的方法是基本一样的,唯一一个不同的地方是:单机检索时,使用的是FSDirectory类来构建IndexReader,而这里则使用FsDirectory类。这个类封装了原有类的方法,并支持HDFS。Nutch中使用的就是FsDirectory类,可以从Nutch的源码中获得该类的源码,直接拷贝过来使用即可。