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条记录
@Test
void testIndexSearch() throws ParseException, IOException {
//1.创建分词器(对搜索的关键词进行分词使用)
//注意:分词器要和创建索引的适合使用的分词器相同
Analyzer analyzer = new StandardAnalyzer();
//2.创建查询对象,第一个参数:默认查询域,如果查询的关键字中带搜索的域名,则从指定域中查询,如果不带域名则从,默认搜索域中查询
//第二个参数:使用的分词器
QueryParser queryParser = new QueryParser("title",analyzer);
//3.设置搜索关键词
Query query = queryParser.parse("java");
//4.创建Directory目录对象,指定索引库的位置
Directory dir = FSDirectory.open(Paths.get("E:\\luceneJdDir"));
//5.创建输入流对象
IndexReader indexReader = DirectoryReader.open(dir);
//6.创建搜索对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//7.搜索,并返回结果
//第二个参数:是返回多少条数据用于展示,分页使用
TopDocs topDocs = indexSearcher.search(query,10);
//获取查询到的结果集的总数
System.out.println("======count======"+topDocs.totalHits);
//8.获取结果集
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//9.遍历结果集
if(Objects.nonNull(scoreDocs)){
for(ScoreDoc scoreDoc: scoreDocs){
//获取查询到的文档唯一标识,文档id,这个id是Lucene在创建文档的时候自动分配的
int docId =scoreDoc.doc;
//通过文档id,读取文档
Document doc = indexSearcher.doc(docId);
//通过域名,从文档中获取域值
System.out.println("===title==="+doc.get("title"));
System.out.println("===img==="+doc.get("img"));
System.out.println("===price==="+doc.get("price"));
}
}
//10.关闭流
indexReader.close();
}