Lucene 4.7 --实现搜索

时间:2022-07-13 03:10:01

先看一段代码

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属性