欢迎光临我的个人网站,CSDN更多以工具文章为主,个人网站里会有更多关于编程思维等多方面的文章
..从产品设计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<String> fields = new HashSet<String>();
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属性
应该不难的,试试看吧!