• 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();
        }
    }
    
  • 相关阅读:
    「专题总结」后缀自动机
    「专题总结」回文自动机
    「专题总结」后缀数组
    2.11毕设进度
    2.10毕设进度
    2.09毕设进度
    2.08毕设进度
    2.07毕设进度
    2.06毕设进度
    2.05毕设进度
  • 原文地址:https://www.cnblogs.com/lixingwu/p/13870603.html
Copyright © 2020-2023  润新知