自己动手写分布式搜索引擎
上QQ阅读APP看书,第一时间看更新

3.1.2 查询索引库

用户界面输入的查询词封装成Query对象后,由IndexSearcher执行查找过程。因为往往只需要最相关的一些文档,所以返回结果封装在一个叫作TopDocs的对象中,如图3-3所示。

图3-3 查询原理

查询部分骨干伪代码。

        // DirectoryReader读入一个目录下的索引文件
        IndexReader ir = DirectoryReader.open(directory);


        //打开索引库
        IndexSearcher searcher = new IndexSearcher(ir);


        //根据查询词搜索索引库
        TopDocs docs = searcher.search(query, 10); //最多返回10个结果


        //遍历查询结果
        ScoreDoc[] hits = docs.scoreDocs;
        for (ScoreDoc hit : hits){
            //…
        }


        //关闭索引库
        searcher.close();

调用Searcher接口按关键词搜索后,返回和给定查询最相关的若干个文档以及匹配上的文档总数。TopDocs封装了搜索结果以及匹配上的文档总数。

TopDocs.scoreDocs就是一个封装后的Document的列表。TopDocs主要包含如下两个属性。

        public class TopDocs {
          public int totalHits; // 查询匹配上的文档总数
          public ScoreDoc[] scoreDocs; // 命中文档列表顶部的文档
        }