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) 设置遇到的最大比分的值

0 0