【Lucene】索引库查询

6.Lucene 索引库查询

前言:本文是衔接上一篇文章来写的,详情看上一篇 【Lucene】索引库的维护

对于索引库我们最关心的就是查询,它能带给我们极好的体验,提高我们的搜索效率。

对要搜索的信息创建 Query 查询对象,Lucene 会根据 Query 查询对象生成最终的查询语法,类似关系数据库 Sql 语法一样 Lucene 也有自己的查询语法,比如:“name:lucene”表示查询 Field 的name 为 “lucene” 的文档信息。

可通过两种方法创建查询对象:

  • 使用 Lucene 提供 Query 子类

  • 使用 QueryParser 解析查询表达式

6.1.TermQuery

TermQuery,通过项查询,TermQuery 不使用分析器所以建议匹配不分词的 Field 域查询,比如订单号、分类ID号等。
指定要查询的域和要查询的关键词。

//使用Termquery查询
@Test
public void testTermQuery() throws Exception {
    Directory directory = FSDirectory.open(new File("D:\\IDEA1\\lelucene\\index").toPath());
    IndexReader indexReader = DirectoryReader.open(directory);
    IndexSearcher indexSearcher = new IndexSearcher(indexReader);
    
    //创建查询对象
    Query query = new TermQuery(new Term("content", "lucene"));
    //执行查询
    TopDocs topDocs = indexSearcher.search(query, 10);
    //共查询到的document个数
    System.out.println("查询结果总数量:" + topDocs.totalHits);
    //遍历查询结果
    for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
        Document document = indexSearcher.doc(scoreDoc.doc);
        System.out.println(document.get("filename"));
        //System.out.println(document.get("content"));
        System.out.println(document.get("path"));
        System.out.println(document.get("size"));
    }
    //关闭indexreader
    indexSearcher.getIndexReader().close();
}

6.2.数值范围查询

private IndexReader indexReader;
    private IndexSearcher indexSearcher;

@Before
public void init() throws Exception {
    indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\IDEA1\\lelucene\\index").toPath()));
    indexSearcher = new IndexSearcher(indexReader);
}

@Test
public void testRangeQuery() throws Exception {
    // 创建一个 Query 对象,查询 size 在 0~100 之间的
    Query query = LongPoint.newRangeQuery("size", 0L, 100L);
    printResult(query);
}

public void printResult(Query query) throws Exception {
    // 执行查询
    TopDocs topDocs = indexSearcher.search(query, 10);
    System.out.println("总记录数:" + topDocs.totalHits);
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    for (ScoreDoc doc : scoreDocs) {
        // 取文档 id
        int docId = doc.doc;
        // 根据 id 取文档对象
        Document document = indexSearcher.doc(docId);
        System.out.println(document.get("name"));
        System.out.println(document.get("path"));
        System.out.println(document.get("size"));
        System.out.println("------------------寂寞的分割线");
    }
    indexReader.close();
}

6.3.使用 queryparser 查询

通过QueryParser 也可以创建 Query,QueryParser 提供一个 Parse 方法,此方法可以直接根据查询语法来查询。Query 对象执行的查询语法可通过 System.out.println(query); 查询。
需要使用到分析器。建议创建索引时使用的分析器和查询索引时使用的分析器要一致。
需要加入 queryParser 依赖的jar包。
在这里插入图片描述

@Test
public void testQueryParser() throws Exception {
    // 创建一个 QueryParser 对象,
    // 参数1:默认搜索域,参数2:分析器对象
    QueryParser queryParser = new QueryParser("name", new IKAnalyzer());
    // 使用 QueryParser 对象创建一个 Query 对象
    Query query = queryParser.parse("lucene是一个Java开发的全文检索工具包");
    // 执行查询,方法在上面哦
    printResult(query);
}

到此 Lucene 就告一段落了,Lucene只是个基础,在全文检索中地位很高,Java 中全文检索就这一种使用 Lucene ,在实际的项目开发中 Lucene 使用的越来越少了,毕竟 API 用起来会麻烦点,一般我们会用 Solr 或者 ElasticSearch 这些技术,主要是学一下原理和一些概念。

【Lucene】系列文章
【Lucene】全文检索技术介绍
【Lucene】实现全文检索
【Lucene】索引库的维护
【Lucene】索引库的查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值