Lucene 4.7 教程起步--搜索IndexSearcher

欢迎光临我的个人网站,CSDN更多以工具文章为主,个人网站里会有更多关于编程思维等多方面的文章

http://blog.guaidm.com/shocky

有什么疑问欢迎沟通:QQ 358391345


..从产品设计css一直做到linux运维的程序猿...  很多技术都是皮毛,各位见谅,只求和大家交流一点小技术,欢迎拍砖!..

TIP: 看了一些回复,首先谢谢大家支持,知道大家一定也希望学习4.7,也不是不想更新,确实时间有限,同时我在项目中负责很多事情,也很杂,不是专门弄搜索引擎开发的,所以即使学到的也不能保证全面。如果大家有什么问题,或者具体哪方面的想法可以提一下,我更多是在开发中遇到需要处理的问题,然后总结才会发布新博客,也不可能完全花时间像写教材一样做哈


上一篇《Lucene 4.7 教程起步--创建索引》已经介绍Lucene4.7.0的索引创建过程,下面是查找功能

查找要简单的多:

下面我在项目中的一段代码:

IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File("F:\\indexDir"))));
QueryParser parser = new QueryParser(Version.LUCENE_47, "", analyzer);
		String queryStr = getQueryStr(paramVO);
		query = parser.parse(queryStr);
		int maxCount = 20;
		TopDocs topDocs = searcher.search(query, maxCount);


几点说明:

0. IndexSearcher的创建方法好像也在新版本做了一些区别

1. anaylzer的定义是这样的:analyzer = new SmartChineseAnalyzer(Version.LUCENE_47); 

2. getQueryStr自定方法的作用是根据VO对象创建Lucene的query语句,而关于query语句的语法,可以参考这里:官方文档对query表达式的解析(主要是与或非的逻辑关系)

3. maxCount最大获取的匹配文档数,比如100个总文档,你的query表达式匹配了50个,但是你传的maxCount为5,那就是选最优的前5个


然后就是拿到TopDocs后对放数据分析出来,或者说,还原打包成一个VO对象,下面是一段示例:

ScoreDoc[] pageDocs = topDocs.scoreDocs;
for (int i = 0; i < pageDocs.length; i++) {
				CarVO item = getDocsItem(query,pageDocs[i]);
				voList.add(item);
			}


private CarVO getDocsItem(Query query, ScoreDoc scoreDoc) throws IOException {

Set fields = new HashSet();
fields.add("carId");
fields.add("carName");

org.apache.lucene.document.Document document = searcher.doc(scoreDoc.doc, fields);
CarVO resultVO = new CarVO();
resultVO.setCarIddocument.getValues("carId")[0]);
	resultVO.setCarName(document.getValues("carName")[0]);
return resultVO;
}

csdn这渣一样的排版我受不了了...

稍微说明一下:

这里field加入进去的就是你之前创建索引时候的Field对象的name属性


应该不难的,试试看吧!



教育培训,网上报名,在线支付,希望大家支持一下啦!

你可能感兴趣的:(小试牛刀)