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");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值