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 ...
随机推荐
- Aspnet Mvc 前后端分离项目手记(二)关于token认证
在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者只用cookie来保持会话. 一,先来复习一下cookie和session 首先我们来复习 ...
- 用Sklearn画一颗决策树
小伙伴们大家好~o( ̄▽ ̄)ブ,首先声明一下,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你的版本至少要3.4以上 Scikit-learn 0.20.0 ...
- 期末Java Web大作业----简易的学生管理系统
学生信息管理系统(大作业) 2018-12-21:此文章已在我的网站更新,添加视图介绍等信息,源码请移步下载https://www.jeson.xin/javaweb-sims.html PS:首先不 ...
- BZOJ2143: 飞飞侠
2143: 飞飞侠 题意: 给出两个 n ∗ m 的矩阵 A,B,以及 3 个人的坐标 在 (i, j) 支付 Ai,j 的费用可以弹射到曼哈顿距离不超过 Bi,j 的位置 问三个人汇合所需要的最小总 ...
- VB.NET或C#报错:You must hava a license to use this ActiveX control.
VB.NET或者C# winform开发时,如果使用了Microsoft Visual Basic 6.0 ActiveX,并动态创建该控件实例,那么程序移植到没有安装Visual Basic 6.0 ...
- Docker安装及基本操作
系统环境 CentOS Linux release 7.5.1804 (Core) 安装依赖包 更新系统软件 yum update 安装docker yum install docker 启动dock ...
- hashlib 模块
import hashlib # ob = hashlib.md5() # ob.update("admin".encode("utf-8")) # print ...
- LeetCode笔记:140. Word Break II
题目描述 给定一个非空的字符串s,一个非空的字符串list作为字典.通过在s中添加空格可以将s变为由list中的word表示的句子,要求返回所有可能组成的句子.设定list中的word不重复,且每一个 ...
- hello1和hello2代码分析
1.hello1代码分析 hello.java package javaeetutorial.hello1; import javax.enterprise.context.RequestScoped ...
- python-监控日志练习
存在一个access.log 日志, 格式如下, 每行 以ip 地址开始: 1.需求: #1.如果同一个ip地址60s之内访问超过200次,那么就把ip加入黑名单#需求分析: #1.60秒读一次文件 ...