1 Lucene的分页查询

搜索内容过多时, 需要考虑分页显示, 像这样:

说明: Lucene的分页查询是在内存中实现的.

2 代码示例

/**
* 检索索引(实现分页)
* @throws Exception
*/
@Test
public void searchIndexByPage() throws Exception {
// 1. 创建分析器对象(Analyzer), 用于分词
// Analyzer analyzer = new StandardAnalyzer();
// 使用ik中文分词器
Analyzer analyzer = new IKAnalyzer(); // 2. 创建查询对象(Query)
// bookName:lucene
// 2.1 创建查询解析器对象
// 参数一: 指定一个默认的搜索域
// 参数二: 分析器
QueryParser queryParser = new QueryParser("bookName", analyzer);
// 2.2 使用查询解析器对象, 实例化Query对象
// 参数: 查询表达式
Query query = queryParser.parse("bookName:lucene"); // 3. 创建索引库目录位置对象(Directory), 指定索引库的位置
Directory directory = FSDirectory.open(new File("/Users/healchow/Documents/index")); // 4. 创建索引读取对象(IndexReader), 用于读取索引
IndexReader reader = DirectoryReader.open(directory); // 5. 创建索引搜索对象(IndexSearcher), 用于执行搜索
IndexSearcher searcher = new IndexSearcher(reader); // 6. 使用IndexSearcher对象, 执行搜索, 返回搜索结果集TopDocs
// search方法: 执行搜索
// 参数一: 查询对象
// 参数二: n - 指定返回排序以后的搜索结果的前n个
TopDocs topDocs = searcher.search(query, 10); // 7. 处理结果集
// 7.1 打印实际查询到的结果数量
System.out.println("实际查询的结果数量: "+topDocs.totalHits);
// 7.2获取搜索的结果数组
// ScoreDoc中: 有我们需要的文档的id, 有我们需要的文档的评分
ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 增加分页实现 ========= start
// 当前页
int page = 2;
// 每页的大小
int pageSize = 2;
// 计算记录起始数
int start = (page - 1) * pageSize;
// 计算记录终止数 -- 得到数据索引与实际结果数量中的最小值, 防止数组越界
// 数据索引: start + pageSize
// 实际的结果数量: scoreDocs.length
int end = Math.min(start + pageSize, scoreDocs.length);
// 增加分页实现 ========= end for(int i = start; i < end; i++){
System.out.println("= = = = = = = = = = = = = = = = = = =");
// 获取文档Id和评分
int docId = scoreDocs[i].doc;
float score =scoreDocs[i].score;
System.out.println("文档Id: " + docId + " , 文档评分: " + score);
// 根据文档Id, 查询文档数据 -- 相当于关系数据库中根据主键Id查询
Document doc = searcher.doc(docId); System.out.println("图书Id: " + doc.get("bookId"));
System.out.println("图书名称: " + doc.get("bookName"));
System.out.println("图书价格: " + doc.get("bookPrice"));
System.out.println("图书图片: " + doc.get("bookPic"));
System.out.println("图书描述: " + doc.get("bookDesc"));
}
// 8. 释放资源
reader.close();
}

3 分页查询结果

这里查询到的结果共有3条, 所以第2页只有一条结果:

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

Lucene 05 - 使用Lucene的Java API实现分页查询的更多相关文章

  1. HDFS 05 - HDFS 常用的 Java API 操作

    目录 0 - 配置 Hadoop 环境(Windows系统) 1 - 导入 Maven 依赖 2 - 常用类介绍 3 - 常见 API 操作 3.1 获取文件系统(重要) 3.2 创建目录.写入文件 ...

  2. ElasticSearch AggregationBuilders java api常用聚会查询

    以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置.index的mapping为: "mappings": { "pl ...

  3. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException

    场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...

  4. Java GUI+mysql+分页查询

    1.要求 : 创建一个学生信息管理数据库 2.实现分页查询 代码如下: a)学生实体类: /** * @author: Annie * @date:2016年6月23日 * @description: ...

  5. Java基础94 分页查询(以MySQL数据库为例)

    1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的).  本文使用的事MySql数据库.       假设:每页显示10条数据.       Select * from c ...

  6. java开发之分页查询

    工具类 package com.luer.comm.utils; import java.util.List; public class PageBean<T> { //已知数据 priv ...

  7. Elasticsearch Java API—多条件查询(must)

    多条件设置 //多条件设置 MatchPhraseQueryBuilder mpq1 = QueryBuilders .matchPhraseQuery("pointid",&qu ...

  8. [ElasticSearch]Java API 之 词条查询(Term Level Query)

    1. 词条查询(Term Query)  词条查询是ElasticSearch的一个简单查询.它仅匹配在给定字段中含有该词条的文档,而且是确切的.未经分析的词条.term 查询 会查找我们设定的准确值 ...

  9. Dynamics CRM2016 Web Api之分页查询

    在dynamics crm web api还没出现前,我们是通过fetchxml来实现的,当然这种方式依旧可行,那既然web api来了我们就拥抱新的方式. web api中我们通过指定查询的条数来实 ...

随机推荐

  1. 结对开发项目--石家庄地铁web版

    一.功能要求 1.数据库设计:将石家庄地铁线路图的各个线路,各个站点,换乘信息等用数据库的形式保存起来,应该保存的信息有 {线路号,线路的各个站名,车站的换乘信息}. 2.站点查询:用户可以输入任一一 ...

  2. kali安装vm tools

    kali安装完毕后第一件事便是安装VMtools,tools能让kali和物理机进行交互,复制粘贴功能等. 在屏幕上会弹出一个光驱,点击进去,进入文件夹 将文件复制到home文件夹下. 1 tar z ...

  3. Centos 7安装python3(PY3.6)

    # 安装 sudo yum install centos-release-scl sudo yum install rh-python36 #开启 scl enable rh-python36 bas ...

  4. SDN网络中hypervisor带来的控制器时延(Hypervisor位置的优化)

    一,问题背景 1.介绍监督器大部分由软件实现,可灵活放置,高效的SDN网络虚拟化需要复杂的技术来放置hypervisor在合适的位置,才能提供租户最佳的性能.称为k-Network Hyperviso ...

  5. Gedit —— 推荐于NOI系列考试(NOIlinux)的轻量编程环境

    由于Vim,Emacs上手艰难,Guide又特别难用,Anjuta还闪退 故推荐一款轻量化的编程环境:Gedit(文本编辑器) 配置方法: 1:在桌面上新建main.cpp,打开方式选择使用gedit ...

  6. Shell 编程注意点

    (一)判断语句 [$# -lt 4 ]判断语句,格式[空格 比较对象1 比较符号 比较对象2] $# 启动脚本时携带参数个数;参数个数总数. $1 代表第一个参数. $? 最后一次执行名命令的退出状态 ...

  7. section标签实现文字滚动

    h5新增样式 section标签 使用demo //h5新增属性 h5新增滚动的标签 <marquee> <div style="padding-left: 20px;ma ...

  8. CDI Features

    概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...

  9. echarts-for-react 从新渲染数据

    <ReactEcharts option={option} notMerge={true}  style={{height: '600px', width: '100%'}} className ...

  10. Jmeter之Non HTTP response code: java.net.SocketException/Non HTTP response message: Permission denied: connect

    最近在做性能测试过程中遇到了高并发时,后台监控各项指标都很正常,但是测试结果中很多Non HTTP response code: java.net.SocketException/Non HTTP r ...