关于索引删除的策略IndexDeletionPolicy
关于索引删除的策略IndexDeletionPolicy 。
public IndexWriter(Directory d, Analyzer a, boolean create)
throws CorruptIndexException, LockObtainFailedException, IOException {
init(d, a, create, false, null, true);
}
构造一个IndexWriter需要调用init()方法进行初始化,init()方法的声明如下所示:
/**
* 该方法中的参数列表中。各个参数的含义如下:
* d :指定的存放建立索引文件的索引目录
* a :一个传递进来分析器
* create :是否要重新写入索引文件,如果为true,则重写索引文件;如果为false,则追加写入索引文件
* closeDir :一个boolean型变量,表示是否关闭索引目录Directory d,它是IndexWriter的一个成员变量
* deletionPolicy :指定删除索引文件使用的策略
* autoCommit :建立索引文件后,不对已经存在的索引进行Clone,自动提交。
*/
private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, IndexDeletionPolicy deletionPolicy, boolean autoCommit)
throws CorruptIndexException, LockObtainFailedException, IOException
IndexDeletionPolicy是一个接口,是有关在建立索引的过程中,对索引文件进行灵活地(删除)操作的一种自定义接口。可以在合适的时机进行删除操作,可以指定删除的时刻,完全可以根据自己的需要进行定制,但是,这可能会造成存储开销,但是相对于删除操作策略的灵活便利性,这也是比较值得的。
IndexDeletionPolicy接口的定义非常简单,而且为我们做了启发式的指引:
package org.apache.lucene.index;
import java.util.List;
import java.io.IOException;
// 该接口示例了两种删除索引文件的时机,即所谓的Points
public interface IndexDeletionPolicy {
// 一个IndexWriter索引器初始化的时候,可以删除一些时刻(提交点)提交的索引文件,这些提交点存放在一个List中,包括最早提交点和最近的提点之间的所有提交点,当然,删除他们是可选的,而且应当慎重,因为一旦删除便不可回滚。
public void onInit(List commits) throws IOException;
// 当新建的索引写入目录,并已经提交的时候,我们仍然可以删除指定List中一些时刻(提交点)提交的索引文件,当然,删除他们是可选的,而且应当慎重
public void onCommit(List commits) throws IOException;
}
IndexDeletionPolicy接口的实现类如图所示:
通过对IndexDeletionPolicy接口的实现类进行学习,把握最基本的索引删除的动机和行为。通过IndexDeletionPolicy接口的实现类的类名就可以大概了解到它的索引删除策略:
1、KeepOnlyLastCommitDeletionPolicy策略
KeepOnlyLastCommitDeletionPolicy类在初始化一个IndexWriter的时候,在init方法中如果指定IndexDeletionPolicy deletionPolicy为null,则默认的索引删除策略为KeepOnlyLastCommitDeletionPolicy。
KeepOnlyLastCommitDeletionPolicy类的源代码非常容易理解,如下所示:
package org.apache.lucene.index;
import java.util.List;
public final class KeepOnlyLastCommitDeletionPolicy implements IndexDeletionPolicy {
// 初始化IndexWriter的时候,除了保留最近的一个提交点以外,删除所有提交点提交的索引文件
public void onInit(List commits) {
// Note that commits.size() should normally be 1:
onCommit(commits);
}
// 除了最近时刻的提交点保留以外,其余的全部删除
public void onCommit(List commits) {
// Note that commits.size() should normally be 2 (if not
// called by onInit above):
int size = commits.size();
for(int i=0;i<size-1;i++) { // IndexCommitPoint也很重要,因为它涉及到了索引段,比较复杂,在后面系统学习
((IndexCommitPoint) commits.get(i)).delete();
}
}
}
2、KeepNoneOnInitDeletionPolicy策略
初始化时删除所有提交点的索引段,最后提交的时候,保留最近提交点的索引段。
class KeepNoneOnInitDeletionPolicy implements IndexDeletionPolicy {
int numOnInit;
int numOnCommit;
public void onInit(List commits) {
verifyCommitOrder(commits);
numOnInit++;
// 初始化的时候,就删除所有的提交点
Iterator it = commits.iterator();
while(it.hasNext()) {
((IndexCommitPoint) it.next()).delete();
}
}
public void onCommit(List commits) {
// 验证每个提交点提交的索引文件(索引段)名称的正确性
verifyCommitOrder(commits);
int size = commits.size();
// 除了最近时刻的提交点保留以外,其余的全部删除
for(int i=0;i<size-1;i++) {
((IndexCommitPoint) commits.get(i)).delete();
}
numOnCommit++;
}
}
3、KeepAllDeletionPolicy策略
保留所有提交点,不删除任何提交点的索引段。
class KeepAllDeletionPolicy implements IndexDeletionPolicy {
int numOnInit;
int numOnCommit;
public void onInit(List commits) {
verifyCommitOrder(commits);
numOnInit++;
}
public void onCommit(List commits) {
verifyCommitOrder(commits);
numOnCommit++;
}
}
4、KeepLastNDeletionPolicy策略
初始化时,不删除任何提交点;最后提交时,保留指定的最近的N个提交点。
class KeepLastNDeletionPolicy implements IndexDeletionPolicy {
int numOnInit;
int numOnCommit;
int numToKeep;
int numDelete;
Set seen = new HashSet(); // Set seen用于保证不重复删除某个提交点
public KeepLastNDeletionPolicy(int numToKeep) { // 初始化显式指定最近提交点的个数
this.numToKeep = numToKeep;
}
public void onInit(List commits) {
verifyCommitOrder(commits);
numOnInit++;
// false指定了不做任何删除
doDeletes(commits, false);
}
public void onCommit(List commits) {
verifyCommitOrder(commits);
doDeletes(commits, true); // 根据初始化的numToKeep,保留最近numToKeep个提交点
}
private void doDeletes(List commits, boolean isCommit) {
if (isCommit) {
String fileName = ((IndexCommitPoint) commits.get(commits.size()-1)).getSegmentsFileName();
if (seen.contains(fileName)) {
throw new RuntimeException("onCommit was called twice on the same commit point: " + fileName);
}
seen.add(fileName); // seen中加入的是已经删除的提交点
numOnCommit++;
}
int size = commits.size();
for(int i=0;i<size-numToKeep;i++) { // 删除前size-numToKeep个提交点
((IndexCommitPoint) commits.get(i)).delete();
numDelete++;
}
}
}
5、ExpirationTimeDeletionPolicy策略
如果某个提交的响应已经超过指定时间,则删除掉这个提交点。
class ExpirationTimeDeletionPolicy implements IndexDeletionPolicy {
Directory dir;
double expirationTimeSeconds; // 指定提交超时时间
int numDelete;
public ExpirationTimeDeletionPolicy(Directory dir, double seconds) {
this.dir = dir;
this.expirationTimeSeconds = seconds;
}
public void onInit(List commits) throws IOException {
verifyCommitOrder(commits);
onCommit(commits);
}
public void onCommit(List commits) throws IOException {
verifyCommitOrder(commits);
IndexCommitPoint lastCommit = (IndexCommitPoint) commits.get(commits.size()-1);
// 根据索引文件的最后提交时间
double expireTime = dir.fileModified(lastCommit.getSegmentsFileName())/1000.0 - expirationTimeSeconds;
Iterator it = commits.iterator();
while(it.hasNext()) {
IndexCommitPoint commit = (IndexCommitPoint) it.next();
double modTime = dir.fileModified(commit.getSegmentsFileName())/1000.0;
if (commit != lastCommit && modTime < expireTime) {
commit.delete();
numDelete += 1;
}
}
}
}
上面五种删除策略,主要地,无非是在索引器初始化的时刻和建立索引提交的时刻,来选择是否删除提交点。
关于索引删除的策略IndexDeletionPolicy的更多相关文章
- ELK日志保留7天-索引生命周期策略
一.简介 ELK日志我们一般都是按天存储,例如索引名为"kafkalog-2022-04-05",因为日志量所占的存储是非常大的,我们不能一直保存,而是要定期清理旧的,这里就以保留 ...
- MySQL索引与优化策略
1. MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,下面主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 M ...
- paip.提升性能--- mysql 建立索引 删除索引 很慢的解决.
paip.提升性能--- mysql 建立索引 删除索引 很慢的解决. 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blo ...
- python 数组中如何根据值,获取索引,如何根据索引删除值 , 以及如何根据值删除值
假设有一数组 s = [1,2,3,4,5,6,7,8,9] (1)如何根据值获取索引 ,如果值为5 , 那对应的索引为? (2)如何根据索引删除值 , 删除数组中索引5对应的值: (3)根据数组中的 ...
- lucene 索引删除
1.IndexWriter和IndexReader都有删除索引的方法:deleteDocuments(); 不建议使用IndexReader删除索引:使用IndexReader进行删除时,必须关闭所有 ...
- mysql中如何删除表上的索引?删除索引?
需求描述: 今天在做SQL的优化的时候,想要把mysql中某个表上的索引删除掉,突然忘记语法了,找到帮助,在此记录下 操作过程: 1.查看表上的索引 show index from ti_o_sms; ...
- elasticserach 索引删除 源码分析
索引的构成 在看IndicesService服务中移除索引的前提,先了解一个Index类的构成,也就是索引的一些基本信息,代码贴图如下: 主要的信息就两个:一个是name,表示索引名称,一个是uu ...
- MySQL外键及级联删除 && 表的存储引擎与创建索引 && 删除数据库和表
Messages表: mysql>create table Messages( ->message_id int auto_increment primary key, ->user ...
- mysql创建索引/删除索引操作
-- 1.ALTER 创建索引 -- table_name表名,column_list列名,index_name索引名 -- 创建index索引 ALTER TABLE table_name ADD ...
随机推荐
- Java的位运算符具体解释实例——与(&)、非(~)、或(|)、异或(^)
位运算符主要针对二进制,它包含了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.以下 ...
- 浅析SSH核心原理(二)
Hibernate是一个开放源代码的ORM(对象-关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任 ...
- linux配置ssh+rsync
ssh 远程登录 sftp 文件共享 类似ftp ssh secure file transfer client scp 文件共享 类似cp ssh配置文件 /etc/ssh/s ...
- php的var关键字
public和var的作用差不多 因为 var定义的变量如果没有加protected 或 private则默认为public php4 中一般是用 varphp5 中就一般是用 public了 现在基 ...
- adb logcat 命令行用法
作者 :万境绝尘 转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 ...
- 基于visual Studio2013解决面试题之0707最小元素
题目
- Python集成开发环境(Eclipse+Pydev)
刚開始学习python,就用Editplus, Notepad++来写小程序, 后来接触了Sublime Text2.认为很不错,没事写写代码.就用编辑器Sublime Text2,最好再配搭一个ap ...
- ftk学习记(对话框篇)
[声明:版权全部,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面谈到了输入法,首先看一看效果. 上面有4个输入框,大家能够分别试试,看看效果怎样. 今天,我 ...
- Swift - 使用socket进行通信(附聊天室样例)
在Swift开发中,如果我们需要保持客服端和服务器的长连接进行双向的数据通信,使用socket是一种很好的解决方案. 下面通过一个聊天室的样例来演示socket通信,这里我们使用了一个封装好的sock ...
- [置顶] PMBOOK第四版-ITO与数据流图总结
具体文档下载地址: 点击打开文档下载地址 :http://download.csdn.net/detail/lyjluandy/6694205 一.过程组与知识领域表(简图) 二.输入 - 工具 - ...