Lucene 4.7 --实现搜索
先看一段代码
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; }
这里field加入进去的就是你之前创建索引时候的Field对象的name属性
知识只有共享才能传播,才能推崇出新的知识,才能学到更多,这里写的每一篇文字/博客,基本都是从网上查询了一下资料然后记录下来,也有些是原滋原味搬了过来,也有时加了一些自己的想法