`
twh1224
  • 浏览: 95604 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Lucene学习(15)

阅读更多
关于索引删除的策略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接口的实现类的类名就可以大概了解到它的索引删除策略:

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;
			}
		}
	}
}



上面五种删除策略,主要地,无非是在索引器初始化的时刻和建立索引提交的时刻,来选择是否删除提交点。
分享到:
评论

相关推荐

    【分享:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    1&gt; lucene学习笔记 2&gt; 全文检索的实现机制 【1】lucene学习笔记的目录如下 1. 概述 3 2. lucene 的包结构 3 3. 索引文件格式 3 4. lucene中主要的类 4 4.1. Document文档类 4 4.1.1. 常用方法 4 4.1.2. 示例 4 4.2...

    lucene高级搜索进阶项目_03

    最后,我们将学习如何利用Lucene的更新和删除功能。在动态数据环境中,我们需要知道如何有效地处理文档的增删改,同时保持索引的一致性和完整性。 总的来说,"Lucene高级搜索进阶项目_03"涵盖了从基础概念到高级...

    开发自己的搜索引擎lucene+heritrix(第2版)(ch13-ch15源码)

    综上所述,"开发自己的搜索引擎lucene+heritrix(第2版)"的源码涵盖了从网络数据抓取到全文检索的全过程,适合开发者深入学习和实践搜索引擎技术。通过研究ch13至ch16的源代码,可以更深入地理解这两个工具的交互和...

    neo4j-lucene-index-1.7.1.zip

    "duration-format" 是一个用于将时间长度转换为易读字符串的库,它有助于将时间间隔(如毫秒、秒、分钟等)转化为像 "2天3小时15分钟" 这样的格式,使非技术人员也能理解。这种库在需要向用户展示时间跨度或者处理...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-15.Lucene高级进阶1 共23页.pptx

    这些知识点构成了一个全面的Lucene学习路径,旨在帮助开发者构建高效、大规模的文本搜索系统,类似于百度搜索的功能。通过深入理解和实践,可以提升对Lucene的理解和使用能力,为构建自己的搜索引擎提供坚实的基础。

    北风网Lucene搜索引擎源码及PPT

    在lucene10.rar到lucene15.rar中,我们可以看到不同版本的索引构建过程,理解如何将文档转换为倒排索引结构,并了解不同版本间的优化改进。 4. **查询解析** Lucene的查询解析器负责将用户的输入转化为可以执行的...

    java学习过程资源

    【学习阶段15】Lucene&Solr(77-78天): Lucene是全文搜索引擎库,Solr是基于Lucene的搜索服务器。学习如何实现高效的文本搜索功能。 【学习阶段16】就业指导(79天): 这个阶段可能包含简历撰写、面试技巧、职业...

    java的28个学习目标

    了解并掌握常用的外部API和框架,如Log4J(日志)、Quartz(调度)、JGroups(网络组通信)、JCache(分布式缓存)、Lucene(全文检索)等。 ### 19. 跨平台与本地接口 学习跨平台开发技巧,掌握JNI(Java Native ...

    Java学习的30个目标

    #### 15. IoC/DI容器与框架 熟悉Spring、PicoContainer等依赖注入(DI)和面向切面编程(AOP)框架,简化应用的配置和模块化。 #### 16. J2EE标准与服务 学习JNDI、JMS、JTA、JMX等J2EE标准服务,提升企业级应用的...

    学习java的30个目标.txt

    #### 目标15:学习依赖注入(DI)和控制反转(IoC)容器 - **框架选择**:Spring、Pico Container、Avalon等。 - **设计模式**:Setter Injection、Constructor Injection、Interface Injection等。 #### 目标16:...

    学习Java语言的30个参考,让你坐拥别人之上的30个擦考

    - **Lucene**:学习全文检索技术的基础知识。 ### 21. 本地接口与连接器 - **JNI、JCA**:掌握Java Native Interface、Java Connector Architecture等技术,实现Java与其他语言或平台的交互。 通过以上知识点的...

    java学习目标

    #### 15. 分布式缓存与全文搜索 掌握分布式缓存如JCache,以及全文搜索引擎如Lucene,是构建高性能应用的关键。 #### 16. 本机接口与连接器 学习Java Native Interface (JNI) 和 Java Connector Architecture ...

    java的30个学习目标

    #### 15. **Web服务器** - Tomcat、Resin、JRun等服务器的配置和管理。 #### 16. **远程方法调用(RMI)** - RMI/IIOP用于实现分布式应用中的对象通信。 #### 17. **XML处理** - JAXP、JDOM、DOM4J、JAXR等API...

    java+大数据.pdf

    另外,还有Lucene、Solr和Elasticsearch(10天)用于全文搜索和数据分析。Scala和Python作为大数据处理的语言,各有5天的学习时间。通信框架Mina和Netty(大数据常用)以及Spark(10天,涵盖所有模块)也是必不可少...

    搜索引擎开发培训课程提纲PPT学习教案.pptx

    15. **关键词提取**:关键词提取是提取文档主题的重要手段,涉及多种算法,例如TF-IDF、TextRank等,并需要通过代码实现。 16. **拼写检查**:英文和中文的拼写检查技术可以提高用户体验,通过统计分析和模型训练来...

    自己动手写搜索引擎pdf.pdf

    这一过程包括三个阶段:准备工作环境(10分钟),编写代码(15分钟),以及发布运行(5分钟)。这显示了搜索引擎开发的快速入门可能性。接下来,书中详细讲解了搜索引擎的基本构成和技术: 1. **网络蜘蛛**(Web ...

    高性能ElasticSearch引擎学习.pdf

    2018年,Elastic公开募股,估值在15亿到30亿美元之间,并于2018年10月5日在纽约证券交易所挂牌上市。 Elasticsearch自诞生以来在大数据领域得到了广泛的应用,功能愈发强大,但其高效的监控和管理仍然是业界关注的...

    最新Java-培训大纲.docx

    - **Lucene到JBPM**:掌握全文检索引擎Lucene,以及工作流引擎JBPM,用于提升系统的搜索功能和业务流程自动化。 9. **XML**: - **语法和解析**:学习XML的语法规范和解析技术,用于数据交换和配置文件处理。 10...

    数据结构算法

    团队沟通利器之UML——活动图 wcf系列(5)wcf系列学习5天速成——第五天 服务托管 wcf系列学习5天速成——第四天 wcf之分布式架构 wcf系列学习5天速成——第三天 事务的使用 wcf系列5天速成——第二天 binding的使用...

Global site tag (gtag.js) - Google Analytics