查询索引库的两类(三种)方式:
使用Query的子类:
termQuery:
关键字查询。需要指定查询的域、关键字
rangeQuery
范围查询。查询的域必须是LongPoint对象。需要指定查询域、大小范围、最大范围
使用QueryPaser类
分析查询。先通过分析器分词,然后再根据分词结果进行查询。
建议创建索引时使用的分析器和查询索引时使用的分析器要一致。
package cn.lxh.lucene;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
/**
* 对索引库的查询操作
*/
public class IndexQuery {
//创建一个IndexReader对象
private IndexReader indexReader;
//创建IndexSearcher查询对象
private IndexSearcher indexSearcher;
@Before
public void init() throws Exception{
indexReader = DirectoryReader.open(FSDirectory.open(new File("F:\\IndexLibrery").toPath()));
indexSearcher = new IndexSearcher(indexReader);
}
@After
public void destory() throws Exception{
//关闭IndexReader
indexReader.close();
}
/**
* 通过【关键词】查询
* 需要指定【查询的域】以及【关键字】
*/
@Test
public void termQueryTest() throws Exception{
//创建一个Query对象,(参数:域的名称,查询的关键字)
Query query = new TermQuery(new Term("content","全文"));
//执行查询
printResult(query,10);
}
/**
* 通过【数值的范围】查询
* 注意 :
* 使用该数值范围查询,则索引库中的该域必须是LongPoint对象
*/
@Test
public void rangeQueryTest() throws Exception{
//创建一个Query对象,(参数:域的名称,查询的最小范围,最大范围)
Query query = LongPoint.newRangeQuery("size",0L,1000L);
//执行查询
printResult(query,10);
}
/**
* 带【分析】的查询
* 原理:
* 把要检索的内容先分析成词组,然后再根据分词的结果进行查询
* 需要使用到 lucene-queryparser-7.4.0.jar 文件
*/
@Test
public void queryParserTest() throws Exception{
//创建一个queryParser对象,(参数一:搜索域,参数二:分析器对象)
QueryParser queryParser = new QueryParser("name",new IKAnalyzer());
//创建一个Query对象,(参数:搜索的内容)
Query query = queryParser.parse("lucene是一个Java开发的全文检索工具包");
//执行查询
printResult(query,10);
}
/**
* 打印搜索查询的结果
* @param query query对象
* @param n 最大的显示数量
*/
public void printResult(Query query,int n) throws Exception{
//5、执行查询(参数:query对象,显示的记录数)
TopDocs topDocs = indexSearcher.search(query, n);
//6、获取查询的总记录数
System.out.println("查询的总记录数为:"+topDocs.totalHits);
//7、取文档列表,操作
ScoreDoc[] docs = topDocs.scoreDocs;
for (ScoreDoc doc : docs) {
//获取文档id
int docId = doc.doc;
//根据文档id获取
Document document = indexSearcher.doc(docId);
//通过文本域名称获取内容
System.out.println("文件名:"+document.get("name"));
System.out.println("文件路径:"+document.get("path"));
//System.out.println("文件内容:"+document.get("content"));
System.out.println("文件大小:"+document.get("size"));
System.out.println("---------------------------------分割线------------------------------------");
}
}
}