Lucene和IKAnalyzer处理中文:索引、搜索实例[续]

版本:lucene3.02, IKAnalyzer3.20
上一篇分享了应用Lucene和IKAnalyzer如何对中文建索引的方法,现在讨论如何在索引基础上进行搜索。
搜索程序(Searcher.java)使用了IKAnalyzer自带的一个查询分析器IKQueryParser,用它来解析keyword经行查询。
根据一般的检索原理,keyword也是作为一个特殊的Document来参与"打分"的。所以keyword解析的好坏直接影响搜索结果的呈现。既然IKAnalyzer的作者“吐血推荐”IKQueryParser来代替lucene原有的解析查询,那我们还是来尝试一下吧。
/** 搜索模块 **/
public class Searcher {
	private File indexDir = new File("F:\\indexDir");;
	
	public void search(String fieldName, String keyword) {
		Directory directory = null;
		IndexSearcher is = null;
		try {
			// 实例化搜索器
			directory = FSDirectory.open(indexDir);
			is = new IndexSearcher(directory, true);
			is.setSimilarity(new IKSimilarity()); // 在索引器中使用IKSimilarity相似度评估器
			
			Query query = IKQueryParser.parse(fieldName, keyword);  // 使用IKQueryParser查询分析器构造Query对象

			TopDocs topDocs = is.search(query, 50);  // 搜索相似度最高的50条记录
			System.out.println("命中:" + topDocs.totalHits);

			// 输出结果
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			for (int i = 0; i < topDocs.totalHits; i++) {
				
				Document targetDoc = is.doc(scoreDocs[i].doc);
				System.out.println("相关性评分:" + scoreDocs[i].score + "\t位置:" + targetDoc.toString());
			}

		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {is.close();} 
					catch (IOException e) {e.printStackTrace();}
			}
			if (directory != null) {
				try {directory.close();} 
					catch (IOException e) {e.printStackTrace();}
			}
		}
	}

	public static void main(String[] args) {
		Searcher search = new Searcher();
		search.search("text", "lucene");
	}
}

你可能感兴趣的:(F#,Lucene)