Lucene系列 - 查询处理(二) - Lucene 信息查询概述及实例

13 篇文章 1 订阅
13 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值