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

3.1.4 查询文档索引

QueryParser这个类位于org.apache.lucene.queryparser.classic包,需要引用lucene-queryparser-6.3.0.jar文件。

新建一个测试类来查询索引,得到查询对象。

        String defaultField = "title";
        String queryString ="test";
        Analyzer analyzer = new StandardAnalyzer();
        QueryParser parser = new QueryParser(defaultField,
                                            analyzer);  //用于解析查询语法
        //从字符串得到查询对象
        Query query = parser.parse(queryString);

调用IndexSearcher.search方法执行搜索后,从IndexSearcher中根据文档编号取出文档对象。

        TopDocs hits = searcher.search(query, 10);
        System.out.println("hits.totalHits:"+ hits.totalHits);
        for (int j = 0; j < hits.scoreDocs.length; j++) {
            //根据文档编号取出文档对象
            Document hitDoc = searcher.doc(hits.scoreDocs[j].doc);
            System.out.println(hitDoc.get("title")); //输出文档
        }

注意,这里的hits.totalHits和hits.scoreDocs.length的值往往不一样。对于网页搜索来说,hits.totalHits表示索引中总的文档数,而hits.scoreDocs.length表示当前页中实际显示的文档数。

因为倒排索引中只存文档编号,不存全文,所以IndexSearcher.search方法搜出来的结果中只有文档编号序列。但Lucene的索引中不只是有倒排索引,还存储了文档内容,所以可以根据文档编号得到文档对象。