- 浏览: 96059 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
fengweiyou:
只取当前年月日 TRUNC(SYSDATE) 就可以了
oracle函数只取年月日 -
spp_1987:
我在页面上 显示出来的 怎么是乱码啊。 能解决下吗
是什 ...
struts+jquery -
spp_1987:
//JSONObject json = JSONObject. ...
struts+jquery -
spp_1987:
不知道为什么 有错啊。 我用的是DispatchAction啊 ...
struts+jquery -
hiteny:
还是css用着方便@ 谢谢啦
css控制字符串显示长度
关于索引删除的策略IndexDeletionPolicy 。
构造一个IndexWriter需要调用init()方法进行初始化,init()方法的声明如下所示:
IndexDeletionPolicy是一个接口,是有关在建立索引的过程中,对索引文件进行灵活地(删除)操作的一种自定义接口。可以在合适的时机进行删除操作,可以指定删除的时刻,完全可以根据自己的需要进行定制,但是,这可能会造成存储开销,但是相对于删除操作策略的灵活便利性,这也是比较值得的。
IndexDeletionPolicy接口的定义非常简单,而且为我们做了启发式的指引:
通过对IndexDeletionPolicy接口的实现类进行学习,把握最基本的索引删除的动机和行为。通过IndexDeletionPolicy接口的实现类的类名就可以大概了解到它的索引删除策略:
1、KeepOnlyLastCommitDeletionPolicy策略
KeepOnlyLastCommitDeletionPolicy类在初始化一个IndexWriter的时候,在init方法中如果指定 IndexDeletionPolicy deletionPolicy为null,则默认的索引删除策略为KeepOnlyLastCommitDeletionPolicy。
KeepOnlyLastCommitDeletionPolicy类的源代码非常容易理解,如下所示:
2、KeepNoneOnInitDeletionPolicy策略
初始化时删除所有提交点的索引段,最后提交的时候,保留最近提交点的索引段。
3、KeepAllDeletionPolicy策略
保留所有提交点,不删除任何提交点的索引段。
4、KeepLastNDeletionPolicy策略
初始化时,不删除任何提交点;最后提交时,保留指定的最近的N个提交点。
5、ExpirationTimeDeletionPolicy策略
如果某个提交的响应已经超过指定时间,则删除掉这个提交点。
上面五种删除策略,主要地,无非是在索引器初始化的时刻和建立索引提交的时刻,来选择是否删除提交点。
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学习(22)
2009-10-30 11:14 883关于FieldInfos类和FieldInfo类。 Fi ... -
Lucene学习(21)
2009-10-30 11:12 847回到IndexWriter索引器类中来,学习该类添加Docum ... -
Lucene学习(20)
2009-10-30 11:06 1034关于Field类和Document类。 ... -
Lucene学习(19)
2009-10-30 11:01 824研究SegmentInfo类的实现 ... -
Lucene学习(18)
2009-10-30 10:47 1876关于SegmentInfos类的具体 ... -
Lucene学习(17)
2009-10-30 10:40 858根据16中对IndexFileDeleter ... -
Lucene学习(16)
2009-10-30 10:33 1073在接触到索引删除的策略IndexDeletionPolicy ... -
Lucene学习(14)
2009-10-30 10:23 760RAMDirectory类是与内存目录相关的,它和FSDire ... -
Lucene学习(13)
2009-10-30 10:21 1371Directory抽象类比较常用的具体实现子类应该是FSDir ... -
Lucene学习(12)
2009-10-30 10:17 696接着昨天学习的Lucene-2.3.1 源代码阅读学习(11) ... -
Lucene学习(11)
2009-10-30 10:06 1122对数据源进行分析,是为建立索引服务的;为指定的文件建立索引,是 ... -
Lucene学习(10)
2009-10-30 10:02 840Lucene的CJKAnalyzer分析器。 CJKAnal ... -
Lucene学习(9)
2009-10-30 09:34 917Lucene的StandardAnalyzer分析器。 ... -
Lucene学习(8)
2009-10-30 09:27 818Lucene分析器的实现。 Lucene(分词)过滤器Tok ... -
Lucene学习(7)
2009-10-30 09:22 758CharTokenizer是一个抽象类 ... -
Lucene学习(6)
2009-10-29 16:16 863Lucene分析器的实现。 Lucene分词器Tokeniz ... -
Lucene学习(5)
2009-10-29 16:13 900研究Lucene分析器的实现。 Analyzer抽象类 ... -
Lucene学习(4)
2009-10-29 16:09 882建立索引,通过已经生成的索引文件,实现通过关键字检索。 ... -
Lucene学习(3)
2009-10-29 16:06 848org.apache.lucene.demo.IndexFil ... -
Lucene学习(2)
2009-10-29 15:59 812IndexWriter是一个非常重要的工具。建立索引必须从它开 ...
相关推荐
1> lucene学习笔记 2> 全文检索的实现机制 【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的更新和删除功能。在动态数据环境中,我们需要知道如何有效地处理文档的增删改,同时保持索引的一致性和完整性。 总的来说,"Lucene高级搜索进阶项目_03"涵盖了从基础概念到高级...
综上所述,"开发自己的搜索引擎lucene+heritrix(第2版)"的源码涵盖了从网络数据抓取到全文检索的全过程,适合开发者深入学习和实践搜索引擎技术。通过研究ch13至ch16的源代码,可以更深入地理解这两个工具的交互和...
"duration-format" 是一个用于将时间长度转换为易读字符串的库,它有助于将时间间隔(如毫秒、秒、分钟等)转化为像 "2天3小时15分钟" 这样的格式,使非技术人员也能理解。这种库在需要向用户展示时间跨度或者处理...
这些知识点构成了一个全面的Lucene学习路径,旨在帮助开发者构建高效、大规模的文本搜索系统,类似于百度搜索的功能。通过深入理解和实践,可以提升对Lucene的理解和使用能力,为构建自己的搜索引擎提供坚实的基础。
在lucene10.rar到lucene15.rar中,我们可以看到不同版本的索引构建过程,理解如何将文档转换为倒排索引结构,并了解不同版本间的优化改进。 4. **查询解析** Lucene的查询解析器负责将用户的输入转化为可以执行的...
- **技术选型**:考虑引入更多前沿技术,如分布式索引技术、深度学习等,以增强搜索系统的智能化水平。 - **用户体验**:不断优化搜索结果的展示形式,提供更丰富的筛选条件和个性化推荐功能,提升用户体验。 综上...
【学习阶段15】Lucene&Solr(77-78天): Lucene是全文搜索引擎库,Solr是基于Lucene的搜索服务器。学习如何实现高效的文本搜索功能。 【学习阶段16】就业指导(79天): 这个阶段可能包含简历撰写、面试技巧、职业...
了解并掌握常用的外部API和框架,如Log4J(日志)、Quartz(调度)、JGroups(网络组通信)、JCache(分布式缓存)、Lucene(全文检索)等。 ### 19. 跨平台与本地接口 学习跨平台开发技巧,掌握JNI(Java Native ...
#### 15. IoC/DI容器与框架 熟悉Spring、PicoContainer等依赖注入(DI)和面向切面编程(AOP)框架,简化应用的配置和模块化。 #### 16. J2EE标准与服务 学习JNDI、JMS、JTA、JMX等J2EE标准服务,提升企业级应用的...
#### 目标15:学习依赖注入(DI)和控制反转(IoC)容器 - **框架选择**:Spring、Pico Container、Avalon等。 - **设计模式**:Setter Injection、Constructor Injection、Interface Injection等。 #### 目标16:...
- **Lucene**:学习全文检索技术的基础知识。 ### 21. 本地接口与连接器 - **JNI、JCA**:掌握Java Native Interface、Java Connector Architecture等技术,实现Java与其他语言或平台的交互。 通过以上知识点的...
#### 15. 分布式缓存与全文搜索 掌握分布式缓存如JCache,以及全文搜索引擎如Lucene,是构建高性能应用的关键。 #### 16. 本机接口与连接器 学习Java Native Interface (JNI) 和 Java Connector Architecture ...
#### 15. **Web服务器** - Tomcat、Resin、JRun等服务器的配置和管理。 #### 16. **远程方法调用(RMI)** - RMI/IIOP用于实现分布式应用中的对象通信。 #### 17. **XML处理** - JAXP、JDOM、DOM4J、JAXR等API...
另外,还有Lucene、Solr和Elasticsearch(10天)用于全文搜索和数据分析。Scala和Python作为大数据处理的语言,各有5天的学习时间。通信框架Mina和Netty(大数据常用)以及Spark(10天,涵盖所有模块)也是必不可少...
15. **关键词提取**:关键词提取是提取文档主题的重要手段,涉及多种算法,例如TF-IDF、TextRank等,并需要通过代码实现。 16. **拼写检查**:英文和中文的拼写检查技术可以提高用户体验,通过统计分析和模型训练来...
这一过程包括三个阶段:准备工作环境(10分钟),编写代码(15分钟),以及发布运行(5分钟)。这显示了搜索引擎开发的快速入门可能性。接下来,书中详细讲解了搜索引擎的基本构成和技术: 1. **网络蜘蛛**(Web ...
Elasticsearch 是一个基于 Lucene 的开源全文搜索引擎,以其分布式、可扩展性、实时搜索以及强大的数据分析能力而受到广泛欢迎。它不仅支持文本搜索,还可以处理结构化和非结构化数据,适用于日志分析、监控、信息...
2018年,Elastic公开募股,估值在15亿到30亿美元之间,并于2018年10月5日在纽约证券交易所挂牌上市。 Elasticsearch自诞生以来在大数据领域得到了广泛的应用,功能愈发强大,但其高效的监控和管理仍然是业界关注的...
- **Lucene到JBPM**:掌握全文检索引擎Lucene,以及工作流引擎JBPM,用于提升系统的搜索功能和业务流程自动化。 9. **XML**: - **语法和解析**:学习XML的语法规范和解析技术,用于数据交换和配置文件处理。 10...