Lucene小练十二(分页搜索)

基于SpringMVC+MyBatis+Lucene4的分页文档搜索系统实战项目 一个典型的搜索服务接口应当包含基本的全文检索方法、精确匹配查询、多字段组合查询以及高级过滤等功能。以下是一个经过抽象的接口定义:/*** 执行全文检索,返回分页结果* @param criteria 查询条件封装对象* @return 分页结果集*//*** 根据唯一ID获取原始文档内容(用于详情查看)* @param docId 文档唯一标识* @return 文档视图对象*//*** 获取热门搜索词统计(可用于推荐)* @param topN 数量。 阅读详情
package Java.se.lucene;
//创建索引
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

public class PageIndex {

	private static Directory directory=null;
	static{
		try {
			directory=FSDirectory.open(new File("f:/lucene/Index05"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static Directory getDirectory()
	{
		return directory;
	}
	public void Index(boolean hasNew)
	{
		IndexWriter writer=null;
		try {
			  writer=new IndexWriter(directory,new IndexWriterConfig
					(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36)));
			if(hasNew)
			{
				writer.deleteAll();
			}
			File file=new File("F:/lucene/lucenes");
			Document doc=null;
			for(File f:file.listFiles())
			{
				doc=new Document();
				doc.add(new Field("content",new FileReader(f)));//添加内容
				doc.add(new Field("filename",f.getName(),Field.Store.YES,
						Field.Index.NOT_ANALYZED));//添加Name
				doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,
						Field.Index.NOT_ANALYZED));
				doc.add(new NumericField("date",Field.Store.YES, true).setLongValue
						(f.lastModified()));
				doc.add(new NumericField("size",Field.Store.YES,true).setIntValue
					((int)f.length()/1024));
				writer.addDocument(doc);
			}
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally
		{
			if(writer!=null)
			{
				try {
					writer.close();
				} catch (CorruptIndexException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}
package Java.se.lucene;
//创建搜索
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Version;

public class PageSearch {

	 private static IndexReader reader=null;
	 public static IndexSearcher getSearcher(Directory directory)
	    {
	    	try {
				reader=IndexReader.open(directory);
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (IOException e){
				e.printStackTrace();
			}

	    	return(new IndexSearcher(reader));
	     }
     //分页查询
	 public void searchPage(String query,int pageIndex,int pageSize)
	    {
	       try {
			   Directory dir=PageIndex.getDirectory();
			   IndexSearcher searcher=getSearcher(dir);
			   //默认搜索域为content
			   QueryParser parser=new QueryParser(Version.LUCENE_36,"content",
					   new StandardAnalyzer(Version.LUCENE_36));
			   //创建 Query
			   Query q=parser.parse(query);
			   TopDocs tds=searcher.search(q,200);
			   ScoreDoc[] sd=tds.scoreDocs;
			   //分页显示,start为每页第一个索引,end是最后一个索引,pagesize是每页显示条数,pageindex是第几页
			   int start=(pageIndex-1)*pageSize;
			   int end=pageIndex*pageSize;
			   for(int i=start;i<end;i++)
			   {
				   Document document=searcher.doc(sd[i].doc);
				   System.out.println(sd[i].doc+"-->"+document.get("path")+"-->"
						   +document.get("filename"));
				}
			   searcher.close();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	  }
	 //不分页查询
	 public void searchNoPage(String query)
	    {
	       try {
			   Directory dir=PageIndex.getDirectory();
			   IndexSearcher searcher=getSearcher(dir);
			   QueryParser parser=new QueryParser(Version.LUCENE_36,"content",
					   new StandardAnalyzer(Version.LUCENE_36));
			   Query q=parser.parse(query);
			   TopDocs tds=searcher.search(q, 200);
			   ScoreDoc[] sd=tds.scoreDocs;
			   for(int i=0;i<sd.length;i++)
			   {
				   Document document=searcher.doc(sd[i].doc);
				   System.out.println(sd[i].doc+"-->"+document.get("path")+"-->"
						   +document.get("filename"));
				}
			   searcher.close();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	  }
	 //After查询
	 public void searchPageByAfter(String query,int pageIndex,int pageSize)
	    {
	       try {
			   Directory dir=PageIndex.getDirectory();
			   IndexSearcher searcher=getSearcher(dir);
			   QueryParser parser=new QueryParser(Version.LUCENE_36,"content",
					   new StandardAnalyzer(Version.LUCENE_36));
			   Query q=parser.parse(query);
			   //获取最后一次搜索的最后一个元素
			   ScoreDoc lastSdDoc=getLastScoreDoc(q, pageIndex, pageSize, searcher);
			   //将所有结果储存在内存中
               TopDocs tds=searcher.searchAfter(lastSdDoc,q,pageSize);
//			   //将所有结果储存在内存中
//			   TopDocs tds=searcher.search(q, 200);
//			   ScoreDoc[] sd=tds.scoreDocs;
//			   //从上次搜索的最后一个开始,索引从零开始
//			   int last=(pageIndex-1)*pageSize-1;
//			   tds=searcher.searchAfter(sd[last],q, 5);
			   for(ScoreDoc sds:tds.scoreDocs)
			   {
				   Document document=searcher.doc(sds.doc);
				   System.out.println(sds.doc+"-->"+document.get("path")+"-->"
						   +document.get("filename"));
				}
			   searcher.close();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	  }
     //获取最后一次搜索的最后一个元素
	 public ScoreDoc getLastScoreDoc(Query query,int pageIndex,int pageSize,IndexSearcher searcher)
	 {
		 if(pageIndex==1)
		 {
			 return null;
		 }
		 int num=(pageIndex-1)*pageSize;
		 TopDocs tds = null;
		try {
			tds = searcher.search(query, num);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return tds.scoreDocs[num-1]; 
	 }
}
package Java.se.lucene;
//测试类
import org.junit.Before;
import org.junit.Test;

public class Test_Page {
	private static PageIndex pi=null;
	private static PageSearch ps=null;
	@Before
	public void init()
	{
		 pi=new PageIndex();
	     ps=new PageSearch();
	}
	@Test
	public void test_pageindex()
	{
		pi.Index(true);
	}
	@Test
	public void test_pagesearch01()
	{
		ps.searchPage("java",3,5);
		System.out.println("---------------------------");
		//ps.searchNoPage("java");
		ps.searchPageByAfter("java",3,5);
	}
	@Test
	public void test_pagesearch02()
	{
		ps.searchPageByAfter("java",3, 5);
	}
	


}
 


Lucene5学习之分页查询 NULL 博文链接:https://iamyida.iteye.com/blog/2193345 立即下载

相关推荐

lucene查询工具类和IndexSearcher分页查询示例

一步一步跟我学习lucene是对近期做lucene索引的总结,大家有问题的话联系本人如蒙加入,不胜感激,大家共同探讨,本人争取每日一博,希望大家持续关注,会带给大家惊喜的

lucene-分页查询

两种方式 分页查询是很常见的需求,比如要查询第10页,每页10条数据。Lucene 分页通常来讲有两种方式:第一种是把100条数据查出来,然后取最后10条。 优点是快,缺点是对内存消耗大。第二种是把第90条查询出来,然后基于这一条,通过searchAfter方法查询10条数据。 优点是内存消耗小,缺点是比第一种更慢  第一种 private static ScoreDoc[] pageSearc...

litengbin的博客 1209

lucene查询结果集分页代码

在lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样虽然避免了内存溢出的可能,但是,每次搜索都要进行一次IO操作,如果大并发访问的时候,你要保证你的硬盘的转速足够的快,还要保证你的cpu有足够高的频率 而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个搜索结果集 一个有100条数据,每页显示10条,就有10页数据. 安装第一种的思路就是,我直接把这100条数据缓存起来,每次翻页时从缓存种读取 而第二种思路就是,我直接从搜索到的结果集种显示前十条给第一页显示,第二页的时候,我在查询一次,给出10-20条数据给第二页显示,我每次翻页都要重新查询 第三种思路就变成了 我第一页仅需要10条数据,但是我一次读出来50条数据,把这50条数据放入到缓存当中,当我需要10--20之间的数据的时候,我的发现我的这些数据已经在我的缓存种存在了,我就直接存缓存中把数据读出来,少了一次查询,速度自然也提高了很多. 如果我访问第六页的数据,我就把我的缓存更新一次.这样连续翻页10次才进行两次IO操作 同时又保证了内存不容易被溢出.而具体缓存设置多少,要看你的服务器的能力和访问的人数来决定

Lucene之分页查询的三种方式-yellowcong

分页查询有三种,一种是直接查询出这页及这页以后的数据,第二种,查询这页以前的最后一条数据,然后再查询这页之后的数据,这种方式还不如第一种方法快,第三种,是根据一个id来进行分页,这种方式适合不变更的数据

6565

智能汽车域控制器FOTA升级方案探讨

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

huibian1234的博客 1569

告别复杂模型:用UFLD算法5分钟搞定车道线检测(附Python代码)

本文介绍了UFLD(Ultra Fast Lane Detection)算法在车道线检测中的高效应用,仅需5行核心代码即可实现实时检测,特别适合边缘计算设备。通过对比传统方法,UFLD在推理速度、模型大小和硬件需求上具有显著优势,是深度学习领域轻量级解决方案的典范。

weixin_27872611的博客 286

Lucene的分页查询

分页查询只需要传入每页显示多少条记录,当前是第几页就可以了。   当然是对搜索返回的结果进行分页,并不是对搜索结果的总数量进行分页,因为我们搜索的时候都是返回前n条记录。   例如indexSearcher.search(query, 100);//只返回前100条记录 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1

yingjianxuehun的专栏 3030

基于STM32的可穿戴式多生理参数实时监测与预警系统

针对传统可穿戴健康设备存在的生理参数监测种类单一、数据处理依赖云端导致响应滞后、续航能力弱等问题,设计一种基于STM32的可穿戴式多生理参数实时监测与预警系统。系统以STM32L476RG低功耗微控制器为核心,集成心率血氧传感器、体温传感器、血压传感器,实现人体心率、血氧饱和度、体温、收缩压/舒张压的同步采集;通过边缘端轻量化数据处理算法完成参数异常判定,结合低功耗硬件设计与软件休眠策略,在保证监测精度的同时延长续航。测试结果表明,系统心率监测误差≤2次/分钟,血氧饱和度误差≤2%,体温误差≤±0.2℃,血

m0_74026776的博客 2039

java鬼混笔记:lucene 7、查询排序和分页

lucene查询排序 lucene分页

u013845177的博客 2169

用迅为RK3588开发板DIY无人机飞控:从电路设计到PID调参全记录

本文详细记录了使用迅为RK3588开发板DIY无人机飞控的全过程,从硬件选型、PCB设计到实时系统构建和PID调参。RK3588核心板凭借其强大的AI算力和丰富接口,成为高性能无人机控制解决方案的理想选择。文章还分享了视觉导航系统集成和实际飞行测试经验,为硬件爱好者提供实用参考。

weixin_29053577的博客 425

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

AI人人懂 3817

lucene再查询分页搜索和lucene的搜索_基于searchAfter的实现

package com.dhb.search; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.lucene.analysis.standard.StandardAnalyze

西楚小羽的专栏 945

蓝鸟四轴飞控系统C程序V3.0(基础版本)深度解读

2. 解析遥控通道数据(油门 / 横滚 / 俯仰 / 偏航),转换为标准化值(-1000~+1000);3. 封装PID初始化(PID_Init,配置KP/KI/KD、输出限幅、积分限幅);,包含姿态角(Attitude_Data.Roll/Pitch/Yaw)、角速度(Gyro_Data.X/Y/Z)、遥控值(RC_Data[0~5])、电池电压(Bat_Volt)、电机PWM值(Motor_PWM[0~3])、系统状态(Sys_State),校验和通过Check_Sum()函数计算;

搏博的专栏 343

lucene的两种分页操作

基于lucene的分页有两种: lucene3.5之前分页提供的方式为再查询方式(每次查询全部记录,然后取其中部分记录,这种方式用的最多),lucene官方的解释:由于我们的速度足够快。处理海量数据时,内存容易内存溢出。 lucene3.5以后提供一个searchAfter,这个是在特大数据量采用(亿级数据量),速度相对慢一点,像google搜索图片的时候,点击更多,然后再出来一批。这种方式就是把数据保存在缓存里面。然后再去取。 以下是再查询部分代码:

千丈之松的专栏 8791

国网DLT698.45协议——采集系统、数据交换(三)

物理层规定了通信单元或其他终端设备与多功能电表的通信接口,接口的物理与电气特性。常见的物理层传输方式有对于RS485、红外、载波通信等通信信道。将数据包装成可传输的帧格式。1、根据通信配置参数完成端口的初始化配置,通信状态初始化为准备接收状态,初始化相关计数器及缓冲区指针。2、链路层及控制子模块负责通信数据的收发控制,各类超时问题的处理。无通信数据接收时,定时初始化通信端口。3、完成协议帧的解析及应答。

一个bug是bug,多个bug能work 8050

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

Lucene.net搜索及高亮分页

using System;using System.Data;using System.IO;using System.Text.RegularExpressions;using Lucene.Net.Analysis.Standard;using Lucene.Net.Documents;using Lucene.Net.QueryParsers;using Lucene.Net.Search;

月黑杀人夜,风高放火时! 1434

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lucene实现分页代码

package cn.csdn.hr.domain; import java.io.Serializable;  /**   *   * Title:   * Description:   * Copyright: Copyright chenhj 2012   * Company: csdn   * @author Project">mailto:chenhj@csdn.n

张晓丛的专栏 3088

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

lucene分页

一、输入关键字的lucene.html       请输入关键字:     二、进行搜索和显示结果的search.jsp                   String   queryString   =   request.getParameter( "keyword ");                       if   (queryString

2051

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

lucene查询分页总结,利用searchAfter等

首先介绍IndexSearch几个常用方法,其他search方法的具体含义请查找lucene API                      void search(Collector results)//低版本Lucene的search方法                     TopDocs search(Query query,int n)//返回前n条结果

2124

lucene的多个字段搜索以及分页并高亮显示

package mutilSearch;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.

技术人宝哥 3487

Lucene的高级使用之分页

物理分页:limit 逻辑分页:代码 // 分页 @Test public void testPageQuery() throws Exception { // 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数: int pageSize = 2;// 每页条数 int pageNum = 3;...

qq_40208605的博客 670

lucene7.5学习笔记(二)搜索及分页的实现

实现了对数据的索引建立后就需要实现通过索引对数据的检索功能了,同时大部分的检索往往要求实现数据分页显示,因此同时需要实现数据的分页功能。 实现查询首先要创建一个IndexSearcher对象,创建代码如下。 String indexDirectoryPath = "D:/code/"; Directory indexDirectory = FSDirectory.open(Paths.get...

tczhoulan的专栏 913

Lucene分页查询

学完了CRUD,对Lucene的了解也比较熟悉了,做一次分页查询加深理解 1. 步骤使用MVC模型进行分页查询并显示在JSP页面上2. 要求输入关键词,查询并且分页显示3. 创建包结构3.1 Bean层3.1.1 PageBean分类的包装类package com.bart.lucene.pagedemo.bean;import java.util.List;/** * 分页的封装类 */pub

Bart_G的博客 932

Lucene3.6的分页查询

分页查询只需要传入每页显示多少条记录,当前是第几页就可以了。   当然是对搜索返回的结果进行分页,并不是对搜索结果的总数量进行分页,因为我们搜索的时候都是返回前n条记录。   例如indexSearcher.search(query, 100);//只返回前100条记录 /** * 对搜索返回的前n条结果进行分页显示 * @p...

胖头鱼 158
上一篇: Lucene小练十二(分页搜索)
下一篇: Lucene小练十三(IK分词器)
S孙大宝
博客等级 码龄15年 55粉丝 65原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值