`
zb_86
  • 浏览: 43185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene 源码小析

阅读更多
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源码和程序

    Lucene是Apache软件基金会下的一个项目,它是一个高性能、全文本搜索库,完全用Java编写。作为一款开源的全文检索工具包,...通过学习和使用Lucene源码,你可以更深入地理解全文检索的工作机制,提升自己的开发技能。

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    lucene源码和教程

    lucene3.0.3源码和教程

    Lucene学习源码.rar

    《深入剖析Lucene:从源码到实践》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,主要用于构建搜索引擎。它提供了一个简单但功能强大的API,使得开发者能够轻松地在应用中实现文本检索功能。Lucene...

    [HeyJava][传智播客]全文检索Lucene源码

    【标题】:“HeyJava传智播客全文检索Lucene源码” 【描述】:这个资源主要聚焦于Lucene,一个广泛使用的全文检索库,由Apache软件基金会开发并维护。通过学习这部分内容,你可以深入理解Lucene如何实现高效的文本...

    Lucene源码

    **Lucene 源码详解** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发,被广泛应用于构建高效的搜索功能。作为一款Java实现的全文搜索引擎架构,Lucene 提供了完整的索引和查询引擎,使得开发者能够快速...

    lucene源码---官网最新下载

    **Lucene 源码分析** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会开发并维护。作为 Java 开发者的一个强大工具,它提供了文本分析、索引和搜索功能,使得开发者能够轻松地在应用程序中实现高级搜索功能...

    一步一步跟我学习Lucene源码之lucene的各种Field

    在深入探讨Lucene Field之前,我们先来了解一下Lucene是什么。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发,用Java编写。它提供了一个简单但功能强大的API,允许开发者在应用程序中添加搜索功能。...

    Annotated Lucene 中文版 Lucene源码剖析

    《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...

    lucene5.0源码包

    《深入剖析Lucene 5.0源码》 Lucene是一个高性能、全文检索库,它为Java开发者提供了在应用程序中实现全文检索功能的工具。在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    lucene源码

    **Lucene 源码分析** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发并维护。它提供了高效的、可扩展的文本搜索功能,是 Java 开发者构建复杂搜索应用的重要工具。深入理解 Lucene 的源码对于 Java ...

    lucene 2.4.1源码在eclipse调试运行通过

    《深入剖析Lucene 2.4.1:在Eclipse中的源码调试与运行》 Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高性能、可扩展的信息检索服务。2.4.1版本是Lucene的一个重要里程碑,本文将详细讲解如何在...

    Lucene源码解读1

    【Lucene源码解读1】 Lucene是一款开源的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。其强大的搜索功能和高效的性能深受开发者喜爱。在深入理解Lucene之前,我们需要先了解它的核心概念...

    lucene源码分析1111

    《深入剖析Lucene源码》 Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。作为开源项目,其源码提供了丰富的学习资源,帮助开发者深入了解搜索引擎的工作原理和实现细节。在这个主题中,我们将...

    lucene全文检索案例源码

    《深入剖析Lucene全文检索案例源码》 在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入...

    lucene.net 2.9.1 源码

    《深入剖析Lucene.NET 2.9.1:源码解析与应用开发》 Lucene.NET 2.9.1是开源搜索引擎库Lucene的.NET版本,它为.NET开发者提供了强大的全文检索和索引功能。这个版本的源码提供了一个宝贵的资源,帮助我们理解其内部...

    Lucene 源码解析

    FileReaderAll函数用来从文件中读取字符串,默认编码为“GBK”。在创建完最重要的IndexWriter之后,就开始遍历需要索引的文件,构造对应的Document和Filed类,最终通过IndexWriter的addDocument函数开始索引。...

    lucene 7.3源码

    《深入剖析Lucene 7.3源码》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护,被广泛应用于各种搜索引擎和信息检索系统中。Lucene 7.3是其一个重要的版本,它在前一版本的基础上进行了一系列的...

Global site tag (gtag.js) - Google Analytics