1、实现步骤
第一步:创建一个Directory对象,也就是索引库存放的位置。
第二步:创建一个indexReader对象,需要指定Directory对象。
第三步:创建一个indexsearcher对象,需要指定IndexReader对象
第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。
第五步:执行查询。
第六步:返回查询结果。遍历查询结果并输出。
第七步:关闭IndexReader对象
2、IndexSearcher搜索方法
方法 | 说明 |
indexSearcher.search(query, n) | 根据Query搜索,返回评分最高的n条记录 |
indexSearcher.search(query, filter, n) | 根据Query搜索,添加过滤策略,返回评分最高的n条记录 |
indexSearcher.search(query, n, sort) | 根据Query搜索,添加排序策略,返回评分最高的n条记录 |
indexSearcher.search(booleanQuery, filter, n, sort) | 根据Query搜索,添加过滤策略,添加排序策略,返回评分最高的n条记录 |
3、代码实现
@Test
public void searchIndex() throws IOException {
//第一步:创建一个Directory对象,也就是索引库存放的位置。
Directory directory = FSDirectory.open(new File("E:\\eclipse-workspace\\ww_19lucene&solr\\index"));
//第二步:创建一个indexReader对象,需要指定Directory对象。
IndexReader indexReader = DirectoryReader.open(directory);
//第三步:创建一个indexsearcher对象,需要指定IndexReader对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。
TermQuery query = new TermQuery(new Term("fileContent", "apache"));
//第五步:执行查询。
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询结果总条数:"+topDocs.totalHits);
//第六步:返回查询结果。遍历查询结果并输出。
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
//获得document的id
int doc = scoreDoc.doc;
//根据documentId获得document
Document document = indexSearcher.doc(doc);
//输出文件信息:文件名、文件大小、文件路径、文件内容
System.out.println(document.get("fileName"));
System.out.println(document.get("filePath"));
System.out.println(document.get("fileSize"));
System.out.println(document.get("fileContent"));
System.out.println("-------------------------------------");
}
//第七步:关闭IndexReader对象
indexReader.close();
}
4、TopDocs
Lucene搜索结果可通过TopDocs遍历,TopDocs类提供了少量的属性,如下:
方法或属性 | 说明 |
totalHits | 匹配搜索条件的总记录数 |
scoreDocs | 顶部匹配记录 |
注意:
Search方法需要指定匹配记录数量n:indexSearcher.search(query, n)
TopDocs.totalHits:是匹配索引库中所有记录的数量
TopDocs.scoreDocs:匹配相关度高的前边记录数组,scoreDocs的长度小于等于search方法指定的参数n