zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    
  • 相关阅读:
    STL--sort源码分析
    进程和线程的区别
    static 关键字 静态成员变量及静态成员函数
    二叉树遍历总结 先序、中序、后续、广度、深度
    C++用new和不用new创建类对象区别
    传输层--TCP和UDP的区别
    传输层的作用
    微信商户/H5支付申请 被拒原因:网站存在不实内容或不安全信息
    Oracle本地网络服务名配置
    存储过程常用技巧
  • 原文地址:https://www.cnblogs.com/lixingwu/p/13870603.html
Copyright © 2011-2022 走看看