lucene初探(三):性能优化篇
System.out.println("文件路径:" + map.get("file_path"));
System.out.println("文件内容:" + map.get("content"));
System.out.println();
System.out.println();
}
}
/**
* 利用创建的内存目录索引检索.
*
* </pre>
*
* @param idxDir
* @param keyword
* @return
* @throws Exception
*/
public static List<Map<String, String>> query(String idxDir, String keyword) throws Exception {
String[] fields = { "file_name", "content" };
// 创建一个分词器,和创建索引时用的分词器要一致
Analyzer analyzer = new IKAnalyzer();
// 创建查询解析器
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, fields, analyzer);
// 将查询关键词解析成Lucene的Query对象
Query query = queryParser.parse(keyword);
// 打开索引目录
File indexDir = new File(idxDir);
Directory directory = FSDirectory.open(indexDir);
Directory ramDir = new RAMDirectory(directory);
// 获取访问索引的接口,进行搜索
IndexReader indexReader = IndexReader.open(ramDir);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// TopDocs 搜索返回的结果
TopDocs topDocs = indexSearcher.search(query, 100);// 只返回前100条记录
int totalCount = topDocs.totalHits; // 搜索结果总数量
System.out.println("搜索到的结果总数量为:" + totalCount);
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 搜索的结果集合
for (ScoreDoc scoreDoc : scoreDocs) {
// 文档编号
int docID = scoreDoc.doc;
// 根据文档编号获取文档
Document doc = indexSearcher.doc(docID);
Map<String, String> map = new HashMap<String, String>();
map.put("file_name", doc.get("file_name"));
map.put("file_path", doc.get("file_path"));
map.put("content", doc.get("content"));
list.add(map);
}
indexReader.close();
indexSearcher.close();
return list;
}
}
??