6.Lucene 索引库查询
前言:本文是衔接上一篇文章来写的,详情看上一篇 【Lucene】索引库的维护
对于索引库我们最关心的就是查询,它能带给我们极好的体验,提高我们的搜索效率。
对要搜索的信息创建 Query 查询对象,Lucene 会根据 Query 查询对象生成最终的查询语法,类似关系数据库 Sql 语法一样 Lucene 也有自己的查询语法,比如:“name:lucene”
表示查询 Field 的name 为 “lucene” 的文档信息。
可通过两种方法创建查询对象:
-
使用 Lucene 提供 Query 子类
-
使用 QueryParser 解析查询表达式
6.1.TermQuery
TermQuery,通过项查询,TermQuery 不使用分析器所以建议匹配不分词的 Field 域查询,比如订单号、分类ID号等。
指定要查询的域和要查询的关键词。
//使用Termquery查询
@Test
public void testTermQuery() throws Exception {
Directory directory = FSDirectory.open(new File("D:\\IDEA1\\lelucene\\index").toPath());
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//创建查询对象
Query query = new TermQuery(new Term("content", "lucene"));
//执行查询
TopDocs topDocs = indexSearcher.search(query, 10);
//共查询到的document个数
System.out.println("查询结果总数量:" + topDocs.totalHits);
//遍历查询结果
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document document = indexSearcher.doc(scoreDoc.doc);
System.out.println(document.get("filename"));
//System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
//关闭indexreader
indexSearcher.getIndexReader().close();
}
6.2.数值范围查询
private IndexReader indexReader;
private IndexSearcher indexSearcher;
@Before
public void init() throws Exception {
indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\IDEA1\\lelucene\\index").toPath()));
indexSearcher = new IndexSearcher(indexReader);
}
@Test
public void testRangeQuery() throws Exception {
// 创建一个 Query 对象,查询 size 在 0~100 之间的
Query query = LongPoint.newRangeQuery("size", 0L, 100L);
printResult(query);
}
public void printResult(Query query) throws Exception {
// 执行查询
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("总记录数:" + topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc doc : scoreDocs) {
// 取文档 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("size"));
System.out.println("------------------寂寞的分割线");
}
indexReader.close();
}
6.3.使用 queryparser 查询
通过QueryParser 也可以创建 Query,QueryParser 提供一个 Parse 方法,此方法可以直接根据查询语法来查询。Query 对象执行的查询语法可通过 System.out.println(query); 查询。
需要使用到分析器。建议创建索引时使用的分析器和查询索引时使用的分析器要一致。
需要加入 queryParser 依赖的jar包。
@Test
public void testQueryParser() throws Exception {
// 创建一个 QueryParser 对象,
// 参数1:默认搜索域,参数2:分析器对象
QueryParser queryParser = new QueryParser("name", new IKAnalyzer());
// 使用 QueryParser 对象创建一个 Query 对象
Query query = queryParser.parse("lucene是一个Java开发的全文检索工具包");
// 执行查询,方法在上面哦
printResult(query);
}
到此 Lucene 就告一段落了,Lucene只是个基础,在全文检索中地位很高,Java 中全文检索就这一种使用 Lucene ,在实际的项目开发中 Lucene 使用的越来越少了,毕竟 API 用起来会麻烦点,一般我们会用 Solr 或者 ElasticSearch 这些技术,主要是学一下原理和一些概念。
【Lucene】系列文章
【Lucene】全文检索技术介绍
【Lucene】实现全文检索
【Lucene】索引库的维护
【Lucene】索引库的查询