Lucene3.5 之 索引删除和更新

如何实现高校科技成果转化的高效对接?.docx 科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载
package com.ethan.index;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexReader.FieldOption;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
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 IndexUtil {
	private String[] ids = {"1","2","3","4","5","6"};
	private String[] emails = {"11@qq.com","22@qq.com","33@126.com","43@yahoo.cn","54@gmail.com","65@qq.com"};
	private String[] contents = {
			"welcome to nba hot",
			"my name is ethan",
			"someone like you ",
			"rolling in the deep, you like",
			"i like fast........",
			"l like sports"
	};
	
	private int[] attachs = {2,3,1,5,4,6};
	private String[] names = {"ethan","sara","michael","wade","lin","paul"};
	
	private Directory directory = null;
	
	public IndexUtil() {
	     try {
			directory = FSDirectory.open(new File("C:\\Users\\ETHAN\\workspace\\hellolucene\\index02"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void index() {
		IndexWriter writer = null;
		
		try {
			writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)) );
			Document doc = null;
			for(int i=0;i<ids.length;i++) {
				doc = new Document();
				doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
				doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
			
				doc.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED));
				doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
				
				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();
				}
			}
		}
		
	}

	public void query() {
		
		try {
			IndexReader reader = IndexReader.open(directory);
			//被存储的
			System.out.println("numDocs: "+reader.numDocs());
			
			//文档总量
			System.out.println("maxDocs: "+reader.maxDoc());
			//删除的文档
			System.out.println("deleteDocs: "+reader.numDeletedDocs());;
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void delete() {
		IndexWriter writer = null;
		
		try {
			writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
			
			//参数是一个选项,可以是一个Query,也可以是一个term,term是一个精确查找的值
			//这里删除id=1的文档,还会留在”回收站“。xxx.del
			writer.deleteDocuments(new Term("id","1"));
		} 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();
				}
			}
		}
		
	}

	public void undelete() {
		//使用IndexReader进行恢复
		IndexReader reader = null;
		try {
			//set readOnly=false
		    reader = IndexReader.open(directory,false);
			reader.undeleteAll();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			 if(reader!=null) {
				 try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			 }
		}
		
	}

	public void forceDelete() {
		IndexWriter writer = null;
		
		try {
			writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
			
			//强制优化,del文件就没了,回收站清空
			writer.forceMergeDeletes();
		} 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();
				}
			}
		}
	}

	/*
	 * 自己手动merge
	 * 多次创建索引,文件会增多,
	 * 比如 5次的话,5个id=1的
	 * 
	 * merge后合并为n段
	 */
	
	public void merge() {
		IndexWriter writer = null;
		try {
			writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
			
			//将索引合并为2段,这两段中的del文件会被清空
			//3.5后不建议使用,开销大,lucene会根据情况自动处理
			writer.forceMerge(2);
		} 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();
				}
			}
		}
	}

	/*
	 * 更新操作
	 */
	public void update() {
		IndexWriter writer = null;
		try {
			writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
			
			//lucene没有提供更新方法,这里操作分为两步
			//匹配后删除 和 添加新的
			
			Document doc = new Document();
			doc.add(new Field("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
			doc.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));
		
			doc.add(new Field("content",contents[0],Field.Store.NO,Field.Index.ANALYZED));
			doc.add(new Field("name",names[0],Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
			
			writer.updateDocument(new Term("id","1"),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 com.ethan.test;

import org.junit.Test;

import com.ethan.index.IndexUtil;

public class IndexTest {
	
	@Test
	public void testIndex() {
		IndexUtil iu = new IndexUtil();
		iu.index();
	}
	/*
	 * numDocs: 24
		maxDocs: 24
		deleteDocs: 0
	 */
	@Test
	public void testQuery() {
		IndexUtil iu = new IndexUtil();
		iu.query();
	}
	/*
	 * numDocs: 20
		maxDocs: 24
		deleteDocs: 4 (id=1 4条)
	 */
	@Test
	public void testDelete() {
		IndexUtil iu = new IndexUtil();
		iu.delete();
	}
	
	/*
	 * numDocs: 7
		maxDocs: 7
		deleteDocs: 0
	 */
	@Test
	public void testUnDelete() {
		IndexUtil iu = new IndexUtil();
		iu.undelete();
	}
	
	/*
	 * numDocs: 6
		maxDocs: 6(7)
		deleteDocs: 0(1)
	 */
	@Test
	public void testForceDelete() {
		IndexUtil iu = new IndexUtil();
		iu.forceDelete();
	}
	
	/*
	 * merge后:
	 * numDocs: 20
		maxDocs: 21
		deleteDocs: 1(因为强制合并为2段,所以_0_1.del没删)
		_0为第一段,不动,把后边的合并为一段
	 */
	@Test
	public void testMerge() {
		IndexUtil iu = new IndexUtil();
		iu.merge();
	}
	
	/*
	 * numDocs: 6
		maxDocs: 7
		deleteDocs: 1
	
	 	删除后 add
	 */
	@Test
	public void testUpdate() {
		IndexUtil iu = new IndexUtil();
		iu.update();
	}
}

索引文件中文件 表示含义:


0.fnm: 保存的field的信息,有哪几个字段


0.fdt,0.fdx:  Store.YES的对应字段的值


0.frq:单词出现的频率


0.nrm: 存储评分信息,权重


0.prx: 偏移量


0.tii,0.tis: 存储索引信息


文档和域的概念:


文档相当于表中的一条记录,域相当于表中每一个字段

optimize() 已被启用,开销比较大
forceMergeDeletes() 强制把回收站的内容给删掉


当segment比较多时,lucene会自动优化处理


TinyML边缘智能振动诊断实战-ESP32完整工程-v1.0.zip 无硬件可完整体验:固件内置信号合成模拟器(严格复现训练物理模型),串口发 S0~S3 切换 4 种机器故障 算子级正确性:用 inspect_model_ops.py 从 tflite 解析出实际算子(EXPAND_DIMS/CONV_2D/RESHAPE/MEAN/FC/SOFTMAX),固件注册逐一对应——规避了 TFLite Micro 最常见的 "Op type not found" 坑 诚实标注:文档中明确区分“合成演示数据 / 工程近似 / 实测值”,并给出接入真实数据的完整流程 立即下载

相关推荐

ffmpeg-Muti-solve-rtspnogood.zip

多路推流MP4本地切换测试。跨平台arm_win

Lucene笔记04-Lucene索引删除更新

一、删除索引 public void delete() { IndexWriter indexWriter = null; try { indexWriter = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUC...

王劭阳的博客 819

基于SpringBoot+Vue校园失物招领系统的设计与实现

校园失物招领系统的设计与实现前端采用了Vue框架,并结合ElementUI来实现界面的设计与布局。后端采用了SpringBoot框架进行开发设计,并结合了Java语言MySQL数据库来实现。在功能上分为了前端用户模块管理员模块。前端用户模块主要实现了招领物品信息的发布、查询与管理,失物信息的发布、管理以及自动匹配招领物品,查看校园相关通知公告。管理员模块主要实现了物品分类管理、校园通知管理以及物品招领信息的查询统计等功能。校园失物招领系统的实现优化失物招领的流程,提高了校园失物招领的效率,促进了校园文化的建设,营造了良好的诚信氛围。

Lucene索引删除更新与查找以及恢复(lucene3.5

package org.itat.text1; import java.io.File; import java.io.IOException; import javax.management.Query; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document

Lves Li的专栏 2491

Lucene3.5索引的创建,删除更新,加权

==注意:在涉及到删除,更改之类的改变索引的操作时,要先重新创建一遍索引,然后再执行相关方法才可以看到效果,否则索引仍然是之前的 1. 索引的创建 (1). 第一步先创建模拟的内容,用于创建索引 private String[] ids = {"1","2","3","4","5"}; private String[] names = {"zhi","dan","feng","zhida

zhidanfeng的专栏 865

4、学习Lucene3.5索引删除更新

(1)删除索引 /** * 删除索引 */ public void deleteIndex(){ IndexWriter indexWriter = createIndexWriter(); /** * deleteDocuments()参数解析: * 第一种:Term term 删除特定的索引

panchang199266的博客 339

Lucene教程(四) 索引更新删除

这篇文章是基于上一篇文章来写的,使用的是IndexUtil类,下面的例子不在贴出整个类的内容,只贴出具体的方法内容。 3.5版本: 先写了一个check()方法来查看索引文件的变化: /** * 检查一下索引文件 */ public static void check() { IndexReader indexReader = null;

三丰的专栏 8650

Lucene创建、查询、删除更新 索引

使用lucene3.5 package com.yj.LunceneTest; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.H

Yan456jie的专栏 446

lucene NRT实时索引学习

     lucene高级版本中添加了对实时索引查询的功能,因为在真实的应用场景中经常会对IndexWriter做写,更新或者删除操作之后马上去做查询操作,之前较低的版本中必要执行commit操作后将索引都写到磁盘之后才能从IndexSearcher 对象上的查询才能更新,老方式比较耗时。         实例代码如下: public class LuceneNrtTest exten...

百岁 223

Lucene5.3高级应用

Lucene5.3高级应用(包含创建索引、搜索、高亮器,分页等等)

caicongyang 2155

lucene5.3.1简单增删改查、评分、分页

lucene5.3.1简单增删改查、评分、分页 package com.innovate.test.lucene.demo; import java.io.IOException; import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analy

k21325的博客 937

[LangChain RAG] 05 LCEL 链与 Memory:从竖线组链到多轮对话

除了固定功能的解析器,也可以自己编写 Lambda 完成自定义逻辑。把普通函数转换为 Runnable 实例,方便自定义函数加入 chain。RunnableLambda(函数对象或 lambda 匿名函数)"我邻居姓:{lastname},刚生了{gender},请起名,仅告知我名字,不要额外信息""姓名{name},请帮我解析含义。res: str = chain.invoke({"lastname": "张", "gender": "女儿"})print(res)

· 307

科技成果转化效率低怎么办?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区如何搭建统一的科技服务平台?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

复现基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,提出了一种改进的秃鹰搜索算法(BES),旨在解决微电网群在复杂运行环境下的多目标、强约束、非线性及高维经济调度问题。通过引入特定优化策略,增强了基础算法的全局搜索能力收敛效率,克服了传统智能算法易陷入局部最优的缺陷。研究构建了一个包含分布式电源、储能系统与多元负荷的微电网群调度模型,以最小化系统综合运行成本为核心目标,综合考虑功率平衡、设备出力能力、储能运行特性等多重约束条件。通过仿真实验验证了所提算法在调度精度、稳定性计算效率方面相较于传统方法具有明显优势,并进一步展示了其在降低能源开支、提升可再生能源消纳水平方面的实际应用价值。; 适合人群:具备一定电力系统基础知识或优化算法背景,从事新能源调度、智能优化算法研究与应用等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网群、综合能源系统等场景下的经济调度优化;②为秃鹰算法及其他群体智能算法的改进、复现与性能对比提供参考范例;③服务于科研仿真、算法验证及工程化应用需求。; 阅读建议:建议读者结合文中提供的Matlab代码实现进行实践操作,重点关注算法改进机制与调度模型的构建逻辑,同时可借助网盘资源获取完整资料,以加深对算法性能表现与应用场景的理解。

上一篇: Lucene3.0的主要变化
下一篇: ibatis2.3.4 学习笔记(CRUD)
EthanQ
博客等级 码龄17年 142粉丝 207原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值