Lucene(5):索引维护

news/2024/11/8 20:48:37/

1 需求

管理人员通过电商系统更改图书信息,这时更新的是关系数据库,如果使用lucene搜索图书信息,需要在数据库表book信息变化时及时更新lucene索引库。

2 添加索引

调用 indexWriter.addDocument(doc)添加索引。

参考入门程序的创建索引。

3 修改索引

更新索引是先删除再添加,建议对更新需求采用此方法并且要保证对已存在的索引执行更新,可以先查询出来,确定更新记录存在执行更新操作。

如果更新索引的目标文档对象不存在,则执行添加。

代码:

    /*** 索引库修改操作* @throws Exception*/@Testpublic void updateIndexTest() throws Exception {//需要变更成的内容Document document = new Document();document.add(new StringField("id", "100000003145", Field.Store.YES));document.add(new TextField("name", "xxxx", Field.Store.YES));document.add(new IntPoint("price", 123));document.add(new StoredField("price", 123));document.add(new StoredField("image", "xxxx.jpg"));document.add(new StringField("categoryName", "手机", Field.Store.YES));document.add(new StringField("brandName", "华为", Field.Store.YES));//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new StandardAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory  dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//修改, 第一个参数: 修改条件, 第二个参数: 修改成的内容indexWriter.updateDocument(new Term("id", "100000003145"), document);//8. 释放资源indexWriter.close();}

luke查看插入的结果

 

4 删除索引

4.1 删除指定索引

根据Term项删除索引,满足条件的将全部删除。

    /*** 测试根据条件删除* @throws Exception*/@Testpublic void deleteIndexTest() throws Exception {//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new StandardAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory  dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//测试根据条件删除indexWriter.deleteDocuments(new Term("id", "100000003145"));//8. 释放资源indexWriter.close();}

效果如下图:索引域没有变化

 

文档域数据被删除掉 

 

4.2 删除全部索引(慎用)

将索引目录的索引信息全部删除,直接彻底删除,无法恢复。

建议参照关系数据库基于主键删除方式,所以在创建索引时需要创建一个主键Field,删除时根据此主键Field删除。

索引删除后将放在Lucene的回收站中,Lucene3.X版本可以恢复删除的文档,3.X之后无法恢复。

代码:

    /*** 测试根据条件删除* @throws Exception*/@Testpublic void deleteIndexTest() throws Exception {//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new StandardAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory  dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//测试删除所有内容indexWriter.deleteAll();//8. 释放资源indexWriter.close();}

索引域数据清空

文档域数据也清空

 

 


http://www.ppmy.cn/news/87513.html

相关文章

分布式调度XXL-JOB

分布式调度XXL-JOB 1.概述 1.1什么是任务调度 比如: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前一天的财务数据,统计汇总 以…

基于差分进化算法的微电网调度研究(Matlab代码实现)​

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

JVM笔记

Java中对象一定分配在堆空间上吗?判断一个对象是否还活着GCgc频繁 Java中对象一定分配在堆空间上吗? 逃逸分析:分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传…

香港VPS服务器如何屏蔽指定访客ip?

​  如果你是一个香港VPS服务器的管理员,你可能会遇到一些不良用户或者恶意攻击者,这些人会尝试通过不断的访问和攻击你的网站来破坏你的网站的运行。如何保护你的网站,你需要使用一些方法来屏蔽这些指定的访客IP。 首先,你需要…

当你在浏览器中输入 URL 时会发生什么?

下面的图解说明了步骤。 1.Bob 在浏览器中输入 URL 并按下 Enter。在这个例子中,URL 由 4 部分组成: 🔹 协议 - http://. 这告诉浏览器使用 HTTP 发送连接到服务器。 🔹 域名 - example.com. 这是站点的域名。 🔹 路径…

通过计算属性来更改几个数据,针对于这几个数据有失焦事件,但是先触发了失焦事件,后获得到了计算属性怎么办,我想先获取到计算属性的值再进行失焦事件

计算属性是惰性的,只有依赖的数据发生变化时才会重新计算。这可能会导致失焦事件先触发,获取到的计算属性值还未更新的情况。要解决这个问题,有两种方法:1. 在失焦事件中加入 setTimeout,等计算属性重新计算后再获取其值。 js computed: {fullName() { /* ... */ } }, metho…

C++入门预备语法

C入门预备语法 C关键字命名空间C输入&输出初步缺省参数函数重载引用内联函数auto和范围for(C11)指针空值nullptr C关键字 命名空间 命名空间是一种将变量名、函数名、类名和库名称等封装到一个命名空间域中,与其他域的同名量相隔离&…

利用视听短片从自然刺激中获得开放的多模式iEEG-fMRI数据集

在认知神经科学领域,数据共享和开放科学变得越来越重要。虽然许多参与认知神经科学实验的志愿者的数据集现在是公开可用的,但颅内脑电图(iEEG)数据的共享相对较少。iEEG是一种高时间和空间分辨率的记录技术,通过在患者…