7.Lucene精确搜索

一、 获取搜索的关键字

获取用户输入的内容,假如我们要搜索文档中 title 字段包含 “组件” 这个词的记录。

二、 根据传入的字段和关键字进行组装搜索语法

TermQuery:

单字段搜索,精确查询,搜索的内容不会分词,"组件"、"刷新 " 可以查询到数据,“组件刷新” 查询不到。

new TermQuery(new Term("title", title)

三、 根据搜索语法到索引中查询得到索引指向的文档编号

创建一个查询对象,然后传入搜索条件,搜索返回TopDocs。

TopDocs存储的是根据关键字查询出来的文档编号列表,我们可指定查询的数量。

// 创建一个索引查询对象
DirectoryReader reader = DirectoryReader.open(fsd);
IndexSearcher searcher = new IndexSearcher(reader);
// 传入查询条件,指定查询10条记录
TopDocs docs = searcher.search(new TermQuery(new Term("title", title)), 10);

四、 根据文档编号的信息查询出文档数据对象

我们查询到文档的编号以后,我就就可以根据编号来获取文档对象了;

TopDocs.totalHits 表示符合条件的数据量。

TopDocs.scoreDocs 表示查询到的文档索引对象,里面的doc属性就表示文档的编号集合。

我们得到文档的编号后就可以使用IndexSearcher的doc方法获取到文档了。

for (ScoreDoc doc : docs.scoreDocs) {
    Document document = searcher.doc(doc.doc);
    System.out.println(document.get("title"));
}

附录:完整代码

@Test
public void termQuery() {
    // lucene索引目录位置
    String indexDir = "E:\\develop\\demo\\lucene-learn\\lucene-index";
    File luceneIndexDirectory = new File(indexDir);
    String title = "组件";
    // 打开索引目录
    try (FSDirectory fsd = FSDirectory.open(luceneIndexDirectory.toPath())) {
        // 创建一个索引查询对象
        DirectoryReader reader = DirectoryReader.open(fsd);
        IndexSearcher searcher = new IndexSearcher(reader);
        // 单字段搜索,单关键字精确查询
        // 组件、刷新 可以查询到数据,组件刷新 查询不到
        TopDocs docs = searcher.search(new TermQuery(new Term("title", title)), 10);
        // 打印
        for (ScoreDoc doc : docs.scoreDocs) {
            Document document = searcher.doc(doc.doc);
            System.out.println(document.get("title"));
        }
        // 关闭查询Reader
        reader.close();
    } catch (IOException e) {
        System.err.println("打开索引目录失败");
        e.printStackTrace();
    }
}
posted @ 2020-10-24 19:27  喵喵扑  阅读(902)  评论(0编辑  收藏  举报