Lucene 07 - 对Lucene的索引库进行增删改查
数据保存在关系型数据库中, 需要实现增、删、改、查操作; 索引保存在索引库中, 也需要实现增、删、改、查操作.
1 添加索引
参考 Lucene 02 - Lucene的入门程序(Java API的简单使用) 中的内容:

2 删除索引
2.1 根据Term删除索引
根据Term删除索引的步骤为:
(1) 创建分析器对象(Analyzer), 用于分词;
(2) 创建索引配置对象(IndexWriterConfig), 用于配置Lucene;
(3) 创建索引库目录对象(Directory), 用于指定索引库的位置;
(4) 创建索引写入对象(IndexWriter), 用于操作索引;
(5) 创建删除条件对象(Term);
(6) 使用IndexWriter对象, 执行删除;
(7) 释放资源.
/**
* 根据Term删除索引
*/
@Test
public void deleteIndexByTerm() throws IOException {
// 1.创建分析器对象(Analyzer), 用于分词
Analyzer analyzer = new IKAnalyzer();
// 2.创建索引配置对象(IndexWriterConfig), 用于配置Lucene
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);
// 3.创建索引库目录对象(Directory), 用于指定索引库的位置
Directory directory = FSDirectory.open(new File("/Users/healchow/Documents/index"));
// 4.创建索引写入对象(IndexWriter), 用于操作索引
IndexWriter writer = new IndexWriter(directory, iwc);
// 5.创建删除条件对象(Term)
// 删除图书名称域中, 包含"java"的索引
// delete from table where name="java"
// 参数一: 删除的域的名称, 参数二: 删除的条件值
Term term = new Term("bookName", "java");
// 6.使用IndexWriter对象, 执行删除
// 可变参数, 能传多个term
writer.deleteDocuments(term);
// 7.释放资源
writer.close();
}
根据Term执行删除操作(indexWriter.deleteDocuments(term))时, 要求对应的Field不能分词且只能是一个词, 且这个Field必须索引过, Lucene将先去搜索, 然后将所有满足条件的记录删除(伪删除, 做了".del"标记) -- 最好定义一个唯一标识来做删除操作.

是否删除索引, 需要分情况讨论: 我们知道, Lucene是以段(segment)来组织索引内容的, 通过Term执行删除操作(indexWriter.deleteDocuments(term))时, 若索引段中仍包含符合条件的文档对象的其他分词的索引, 就会保留整个索引数据(若采取更新操作, 则会降低性能), 如果没有, 则也将删除索引数据:

查看删除了的文档的编号:

2.2 删除全部索引(慎用)
删除全部索引的步骤为:
(1) 创建分析器对象(Analyzer), 用于分词;
(2) 创建索引配置对象(IndexWriterConfig), 用于配置Lucene;
(3) 创建索引库目录对象(Directory), 指定索引库位置;
(4) 创建索引写入对象(IndexWriter), 用于操作索引库;
(5) 使用IndexWriter对象, 执行删除;
(6) 释放资源.
/**
* 删除全部索引
*/
@Test
public void deleteAllIndex() throws IOException {
// 1.创建分析器对象(Analyzer), 用于分词
Analyzer analyzer = new IKAnalyzer();
// 2.创建索引配置对象(IndexWriterConfig), 用于配置Lucene
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);
// 3.创建索引库目录对象(Directory), 用于指定索引库的位置
Directory directory = FSDirectory.open(new File("/Users/healchow/Documents/index"));
// 4.创建索引写入对象(IndexWriter), 用于操作索引
IndexWriter writer = new IndexWriter(directory, iwc);
// 5.使用IndexWriter对象, 执行删除
writer.deleteAll();
// 6.释放资源
writer.close();
}
删除后的索引结果:

删除全部索引, 将文档域的数据, 索引域的数据都删除.
类似于关系型数据库的Truncate删除: 完全删除数据, 包括存储结构, 因而更快速.
3 更新索引
Lucene是根据Term对象更新索引: 先根据Term执行查询, 查询到则执行更新, 查询不到则执行添加索引.
更新索引的步骤为:
(1) 创建分析器对象(Analyzer), 用于分词;
(2) 创建索引配置对象(IndexWriterConfig), 用于配置Lucene;
(3) 创建索引库目录对象(Directory), 用于指定索引库的位置;
(4) 创建索引写入对象(IndexWriter), 用于操作索引库;
(5) 创建文档对象(Document);
(6) 创建Term对象;
(7) 使用IndexWriter对象, 执行更新;
(8) 释放资源.
/**
* 更新索引
*/
@Test
public void updateIndexByTerm() throws IOException{
// 1.创建分析器对象(Analyzer), 用于分词
Analyzer analyzer = new IKAnalyzer();
// 2.创建索引配置对象(IndexWriterConfig), 用于配置Lucene
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);
// 3.创建索引库目录对象(Directory), 用于指定索引库的位置
Directory directory = FSDirectory.open(new File("/Users/healchow/Documents/index"));
// 4.创建索引写入对象(IndexWriter), 用于操作索引
IndexWriter writer = new IndexWriter(directory, iwc);
// 5.创建文档对象(Document)
Document doc = new Document();
doc.add(new TextField("id", "1234", Store.YES));
// doc.add(new TextField("name", "MyBatis and SpringMVC", Store.YES));
doc.add(new TextField("name", "MyBatis and Struts2", Store.YES));
// 6.创建Term对象
Term term = new Term("name", "SpringMVC");
// 7.使用IndexWriter对象, 执行更新
writer.updateDocument(term, doc);
// 8.释放资源
writer.close();
}
第一次执行, 由于没有查找到对应的索引, 故执行添加功能, 结果如图(不区分大小写):

第二次执行时, 由于索引库中已有"name"="SpringMVC"的内容, 故执行更新操作: 将整个TextField的内容:MyBatis and Struts2添加到索引库中, 并与上次的结果合并, 结果如下图示:

若第二次执行时更改了Term中name域的条件值(索引中没有对应的), 将继续执行添加功能: 将整个TextField中的内容添加到索引中.
版权声明
作者: 马瘦风
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
Lucene 07 - 对Lucene的索引库进行增删改查的更多相关文章
- lucene索引库的增删改查操作
1. 索引库的操作 保持数据库与索引库的同步 说明:在一个系统中,如果索引功能存在,那么数据库和索引库应该是同时存在的.这个时候需要保证索引库的数据和数据库中的数据保持一致性.可以在对数据库进行增.删 ...
- django-数据库的增删改查操作
django-数据库的增删改查操作 1.添加用户记录 def login(request): 增加用户记录 使用save()方法来增加记录 username = UserInfo(username=' ...
- MySQL数据库篇之库的增删改查
主要内容: 一.系统数据库介绍 二.创建数据库 三.数据库增删改查 四.MySQL添加注释 1️⃣ 系统数据库介绍 1.初识sql语句 有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱 ...
- 啊啊啊啊啊啊啊今天就写,炒鸡简单 数据库Sqlite的创建,库的增删改查
啦啦啦啦啦啦啦 写这个不用多长时间,我直接写代码注释都是些语句,Sql语句和Api来操作数据库 ,语句的参数我会注释 SQLite数据库创建数据库需要使用的api:SQLiteOpenHelper必须 ...
- ES 16 - 对Elasticsearch中的索引数据进行增删改查 (CRUD)
目录 1 创建document 1.1 创建时手动指定id 1.2 创建时自动生成id 2 查看document 2.1 根据id查询文档 2.2 通过_source字段控制查询结果 3 修改docu ...
- PHP使用mysqli扩展库实现增删改查(面向对象版)
mysqli扩展库是mysql扩展库的改进版本,在mysql扩展库的基础上提高了稳定性和效率,mysqli扩展库有两套东西,一套就是面向过程的mysqli另一套是面向对象的mysqli.操作方式大体和 ...
- SQL---->mySQl数据库1------数据库的增删改查备份恢复
1.在终端输入:mysql -uroot -p 然后输入密码,进入客户端 2.输入:\s 3.创建数据库 3.1创建字符集是utf-8的数据库 3.2创建带校验规则的数据库,校验规则可以在a ...
- 最简单的基于JSP标准标签库的增删改查
创建数据库中的表:CREATE TABLE `websites` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL DE ...
- day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作
在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...
随机推荐
- VUE2+elementUI前端实现 三级省市联动select
html: <el-form-item label="选择地区:"> <el-select size="small" style=" ...
- UOJ.311.[UNR#2]积劳成疾(DP)
UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...
- 黑洞版视频裂变程序【接口版】全新上线,全新UI,支持分享数据统计
黑洞版视频裂变程序[接口版]全新上线,全新UI,支持分享数据统计! 后台效果 程序统一售价:1899/套(包安装,包更新) 注:本程序不属于之前视频程序的更新版,展现形式和广告位设置均不同,是 ...
- Android中的数据持久化机制
Android中几种最简单但是却最通用的数据持久化技术:SharedPreference.实例状态Bundle和本地文件. Android的非确定性Activity和应用程序生存期使在会话间保留UI状 ...
- python入门 -- 环境搭建(windows)
1. 下载Anaconda Anaconda内置了python解释器及经常使用的库,提供了编译好的环境.根据自己的操作系统,自行从下面网站挑选一个较新的版本,下载安装即可. https://mirro ...
- 推荐一些iOS博客
公司性质的: 公司 地址 美团 http://tech.meituan.com/archives 个人博客: 博主 地址 (斜体的技术文章较少) 王巍(onevcat) https://onevcat ...
- 初入linux系统
作为微软的老铁粉了,看到微软进军linux这么久了,是时候该跟上脚本了,不然该落后了,脚步是如此之快,着实让我吃了一惊,说干就干, 绝不是开玩笑的,谁也阻止不了.net开源,跨平台的脚步了.以前别人说 ...
- 发布版本Debug和Release的区别
1.Debug是调试版本不会对项目发布的内容进行优化,并且包含调试信息容量会大很多 2.Release不对源代码进行调试,对应用程序的速度进行优化,使得发布的内容容量等都是最优的
- php使用protobuf3
protoc的介绍,安装 1.定义一个protoc 文件 示例:person.proto syntax="proto3"; //声明版本,3x版本支持php package tes ...
- webapi 知识点
在web api 中后台的方法必须 加入 [HttpGet] ,[HttpPost],[HttpPut],[HttpDelete] 来区分,这是一种习惯. ps: get 方式参数都存在http协议头 ...