6.2 Lucene查询概述:
6.2.1 查询操作基础
6.2.2 查询入门实例
6.2.3 查询工具IndexSearcher类
6.2.4 查询封装Query类
6.2.5 查询分析器QueryParser类
6.2.6 查询结果集Hits类
6.2.1 查询操作基础:
一个有效的搜索查询器需要具备:
检索查询词分析功能、索引文件访问和查询功能、检索结果的获取和排序功能。
Lucene基本搜索调用流程示意图:
索引已建立 -> 准备索引目录 -> IndexSearcher实例化 -> 生成索引项Term -> 生成检索Query类对象 ->
检索查询生成Hits对象 -> 循环获取Hits结果集中文档内容 -> 关闭IndexSearcher -> 结束。
6.2.2 查询入门实例:
/**
* 检索查询器
* @param indexPath 索引文件路径
*/
public static void queryIndex(File indexPath) {
try {
Directory directory = FSDirectory.open(indexPath);
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Term term = new Term("id", "001");
TermQuery query = new TermQuery(term);
TopDocs results = searcher.search(query, 5);
// System.out.println(results.totalHits);
ScoreDoc[] docs = results.scoreDocs;
for (ScoreDoc doctmp : docs) {
System.out.println(doctmp.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
6.2.3 查询工具IndexSearcher类:
Index Searcher是检索的主要控制器和工具,是所有搜索操作的入口。
实例demo:
Directory directory = FSDirectory.open(indexPath);
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Index Searcher类最核心的方法是检索数据的Search方法:
通过重载来实现多种检索方式,通过传入不同的参数来控制排序、过滤及结果集收集的方式。
主要参数有:
1、检索条件参数Query
2、过滤条件Filter
3、检索结果全集参数HitCollector, results用来保存搜索的所有结果内容
4、检索排序参数Sort
5、权重参数 Weight
注意:
在使用过程中,随着索引不断更新,需要重新生成IndexSearcher实例,才能检索到新加的数据内容。
6.2.4 查询封装Query类:
在搜索过程中,Query对象用来根据用户的检索关键字构造检索的实例对象。
每一个Query实例代表了一个查询请求。
Query类本身是一个抽象类,无法直接实例化。
eg:
Term term = new Term("id", "001");
TermQuery query = new TermQuery(term);
6.2.5 查询分析器QueryParser类:
处理用户输入的查询条件。把用户输入的非格式化检索词转化成后台索引可以理解的Query对象。
基本步骤:
- 1、生成分析器实例。用于指定字段检索内容的分析;
要与索引创建时对应域上的分析器一致,否则无法完全匹配检索内容。
- 2、创建查询解析器实例。对指定域的检索词进行分析;
通常对应一个文本分析器实例,分析器的作用范围是对整个域的检索。
- 3、调用查询解析器的Parse方法。对输入的检索词进行分析;
分析的结果形成对应的Lucene查询对象,用于后续的实际检索。
/**
* 检索查询器
* @param indexPath 索引文件路径
* @param field 待查询域字典
* @param searchWords 待查询域值
*/
public static void queryIndex(File indexPath, String field, String searchWords) {
try {
Directory directory = FSDirectory.open(indexPath);
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser(field, analyzer);
Query query = parser.parse(searchWords);
System.out.println("query : " + query.toString());
TopDocs results = searcher.search(query, 20);
// Term term = new Term("id", "001");
// TermQuery query = new TermQuery(term);
// TopDocs results = searcher.search(query, 5);
System.out.println(results.totalHits);
ScoreDoc[] docs = results.scoreDocs;
for (ScoreDoc doctmp : docs) {
System.out.println(doctmp.toString());
}
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
6.2.6 查询结果集Hits类(老版本):
新版本采用TopDocs类来提供查询结果集。
字段:
以下是 org.apache.lucene.search.TopDocs 类的字段:
- ScoreDoc[] scoreDocs – 排名靠前的查询。
- int totalHits – 命中的查询的总数。
eg:
TopDocs results = searcher.search(query, 5);
System.out.println(results.totalHits);// 命中的查询的总数。
ScoreDoc[] docs = results.scoreDocs;//排名靠前的查询。
for (ScoreDoc doctmp : docs) {
System.out.println(doctmp.toString());
}
类构造函数:
- TopDocs(int totalHits, ScoreDoc[] scoreDocs, float maxScore)
类方法:
- getMaxScore() 返回遇到的最大比分的值
- static TopDocs merge(Sort sort, int topN, TopDocs[] shardHits)
返回一个新的TopDocs,包含横跨提供TopDocs 的topN结果,由指定的 Sort 排序
- void setMaxScore(float maxScore) 设置遇到的最大比分的值