lucene3.0
源代码流程: index
IndexWriter:
1, setMessageID: 基本没用
2, DocumentWriter: 写多个document的writer。
3, directory.clearLock NativeFSLockFactory
(其中Directory的生成根据系统
if (Constants.WINDOWS) {
return new SimpleFSDirectory(path, lockFactory);
} else {
return new NIOFSDirectory(path, lockFactory);
}
)
4, Lock writeLock = directory.makeLock (NativeFSLockFactory来完成clearlock和getlock)
5, writeLock.obtain(writeLockTimeout) 也就是说我觉得以上工作都只是init一个lock,但是并没有去obtain
6, if create is true: 以下读取的应该是原有的directory中的index
7, Segmentinfo seg = new Segmentinfos();
8, clear(); 把以前的segment clear
9, checksum; 应该是核查文件的正确性
10, lastgeneration = generation = generationFromSegmentFileName(String filename); generation是个int
11, int format = input.readInt(); 格式都是负数,至于保存在哪个文件中,目前还未知,应该是Segments那个
if(format < 0){ // file contains explicit format info
// check that it is a format we can understand
if (format < CURRENT_FORMAT)
throw new CorruptIndexException("Unknown format version: " + format);
version = input.readLong(); // read version
counter = input.readInt(); // read counter
}
else{ // file is in old format without explicit format info
counter = format;
}
if(format >= 0){ // in old format the version number may be at the end of the file
if (input.getFilePointer() >= input.length())
version = System.currentTimeMillis(); // old file format without version number
else
version = input.readLong(); // read version
}
12,segmentInfos.clear(); 应该是读取之前存在的directory之后执行的clear()操作
13,deleter = new IndexFileDeleter
14,pushMaxBufferedDocs(); 这个似乎只是让LogDocMergePolicy设置一个minMergeSize
final MergePolicy mp = mergePolicy;
LogDocMergePolicy lmp = (LogDocMergePolicy) mp;
lmp.setMinMergeDocs(maxBufferedDocs);
addDocument:
1, DocumentsWriter:
# 得到一个线程,在lucene2.3之后,DocumentWriter多线程写document
final DocumentsWriterThreadState state = getThreadState(doc, delTerm);
state.consumer.processDocument();
processDocument方法里面 startDocument 好像没有什么用
重要:
init: DocFieldProcessorPerThread extends DocConsumerPerThread
DocFieldProcessorPerField 单独的class
DocFieldConsumersPerThread extends DocFieldConsumerPerThread
DocInverterPerThread extends DocFieldConsumerPerThread
DocFieldConsumersPerField extends DocFieldConsumerPerField
DocInverterPerField extends DocFieldConsumerPerField
调用过程:
DocFieldProcessorPerThread 调用DocFieldConsumerPerThread 作为自己的consumer
然后调用DocFieldProcessorPerField 处理每一个Field的hash和QuictSort
然后调用每一个Field的Consumer,也就最终是DocInverterPerField 的processFields方法
2, finishDocument(state, perDoc); 完成后续工作,具体内容没完全看完。
其中第一步进行 balanceRam 系统中有3块内存,posting table, byte blocks, char blocks. 应该是调节3者的平衡,因为一个document如果分词太多,可能占据了posting 的绝大部分。
3, flush(boolean triggerMerge, boolean flushDocStores, boolean flushDeletes);
ensureOpen(false)
doFlush() doFlushInternal 做了很多flush、delete、写混合index等工作,还有flush后处理工作以及checkpoint();
docwriter.clearFlushPending
maybeMerge()
updatePendingMerges 做一个merge前准备工作
mergeScheduler.merge(this); this表示DocumentsWriter
optimize 没有仔细看,主要工作就是merge
如文档所说,optimize(boolean doWait) : you can specify whether the call should block until the optimize completes 应该指的是在optimize完成之前,整个indexwriter的call被block了。
代码:
if (doWait)
synchronized(this)
close
从文档看因为lock的原因,如果在close过程中发生Exception,即使是在flush部分后发生Exception,也一样会保证原disk上的index不变
另外,从eg看writer.close()都只是放在try中,而没有放在finally中
IndexReader.deleteDocument(int doc)/deleteDocuments(Term term)
本质调用doDelete()
DirectoryReader.doDelete() 调用subReader,也就是segmentReader
SegmentReader.doDelete()
deletedDocs.getAndSet(docNum) 实际上在deleteDocs这个BitVector中添加要删除的docNum
和IndexWriter一样,close的时候会提交一个commit,commit的工作很多,包括减少本身(IndexReader)引用,用IndexFileDeleter删除需要删除的文件等等。pending的工作,正好和上面的doDelete符合,上面的doDelete删除的时候,如果失败,就会添加到pending中。
重要:
这里有一个结构很不错: 例子中IndexReader实际上是DirectoryReader,通过以下方法调用SegmentReader。这种自身不同类别调用,方法得到重用,结构清晰。
for (int i = 0; i < subReaders.length; i++)
subReaders[i].commit(); subReader即segmentReader
另外,整个lucene中用了很多checkpoint机制,例如startCommit()即开始一个checkpoint。这样一旦出错,可以rollback. 例如在IndexReader.close的时候,DirectoryReader.commit --> startCommit --> segmentReader(startCommit) --> segmentReader.commit --> if (!success) rollbackCommit --> segmentReader.rollbackCommit
Deleter:
几个重要的方法:
1, deleter.checkpoint
2, deleter.close
3, deleter.refresh
分享到:
相关推荐
Lucene是Apache软件基金会下的一个项目,它是一个高性能、全文本搜索库,完全用Java编写。作为一款开源的全文检索工具包,...通过学习和使用Lucene源码,你可以更深入地理解全文检索的工作机制,提升自己的开发技能。
### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...
lucene3.0.3源码和教程
《深入剖析Lucene:从源码到实践》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,主要用于构建搜索引擎。它提供了一个简单但功能强大的API,使得开发者能够轻松地在应用中实现文本检索功能。Lucene...
【标题】:“HeyJava传智播客全文检索Lucene源码” 【描述】:这个资源主要聚焦于Lucene,一个广泛使用的全文检索库,由Apache软件基金会开发并维护。通过学习这部分内容,你可以深入理解Lucene如何实现高效的文本...
**Lucene 源码详解** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发,被广泛应用于构建高效的搜索功能。作为一款Java实现的全文搜索引擎架构,Lucene 提供了完整的索引和查询引擎,使得开发者能够快速...
**Lucene 源码分析** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会开发并维护。作为 Java 开发者的一个强大工具,它提供了文本分析、索引和搜索功能,使得开发者能够轻松地在应用程序中实现高级搜索功能...
在深入探讨Lucene Field之前,我们先来了解一下Lucene是什么。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发,用Java编写。它提供了一个简单但功能强大的API,允许开发者在应用程序中添加搜索功能。...
《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...
《深入剖析Lucene 5.0源码》 Lucene是一个高性能、全文检索库,它为Java开发者提供了在应用程序中实现全文检索功能的工具。在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好...
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
**Lucene 源码分析** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发并维护。它提供了高效的、可扩展的文本搜索功能,是 Java 开发者构建复杂搜索应用的重要工具。深入理解 Lucene 的源码对于 Java ...
《深入剖析Lucene 2.4.1:在Eclipse中的源码调试与运行》 Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高性能、可扩展的信息检索服务。2.4.1版本是Lucene的一个重要里程碑,本文将详细讲解如何在...
【Lucene源码解读1】 Lucene是一款开源的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。其强大的搜索功能和高效的性能深受开发者喜爱。在深入理解Lucene之前,我们需要先了解它的核心概念...
《深入剖析Lucene源码》 Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。作为开源项目,其源码提供了丰富的学习资源,帮助开发者深入了解搜索引擎的工作原理和实现细节。在这个主题中,我们将...
《深入剖析Lucene全文检索案例源码》 在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入...
《深入剖析Lucene.NET 2.9.1:源码解析与应用开发》 Lucene.NET 2.9.1是开源搜索引擎库Lucene的.NET版本,它为.NET开发者提供了强大的全文检索和索引功能。这个版本的源码提供了一个宝贵的资源,帮助我们理解其内部...
FileReaderAll函数用来从文件中读取字符串,默认编码为“GBK”。在创建完最重要的IndexWriter之后,就开始遍历需要索引的文件,构造对应的Document和Filed类,最终通过IndexWriter的addDocument函数开始索引。...
《深入剖析Lucene 7.3源码》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护,被广泛应用于各种搜索引擎和信息检索系统中。Lucene 7.3是其一个重要的版本,它在前一版本的基础上进行了一系列的...