Lucene系列
来源:互联网 发布:数据库统计分析工具 编辑:程序博客网 时间:2024/03/29 03:07
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) 设置遇到的最大比分的值
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene系列
- Lucene.net 系列一
- Lucene.net 系列一
- Lucene.Net系列一
- Lucene.net 系列一
- Lucene.net 系列一
- lucene系列教程
- lucene系列教程
- POJ 2070 Filling Out the Team G++
- 51Nod
- c++作业三
- 栈和队列相关面试题(1)
- 重学java,个人学习
- Lucene系列
- leetcodeOJ 121. Best Time to Buy and Sell Stock
- ListView笔记
- leetCode---3Sum
- uC/OS-II源码解析(ucos_ii.h)
- Tinkphp模板中的元素取值问题
- TCP协议-相关面试题
- java xml 转换对象
- 移位运算符