前一篇文章(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的源碼中獲得該類的源碼,直接拷貝過來使用即可。