热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene3.0.0之样例解析(3)IndexFiles.java

一.consumer的来源接着上一小节的内容,还是从这一段程序(位于DocumentWriter.updateDocument(Document,Analyzer,Term)中继续

一. consumer的来源

    接着上一小节的内容, 还是从这一段程序(位于DocumentWriter.updateDocument(Document, Analyzer, Term) 中继续.

try {

// This call is not synchronized and does all the

// work

final DocWriter perDoc = state.consumer.processDocument();

// This call is synchronized but fast

finishDocument(state, perDoc);

success = true;

}

     第一句话就是生成索引的一个过程, 下面我将详细的剖析这个过程.

     首先一个问题就是:consumer是怎么来的? 什么时候初始化的, 我们用单步程序的方法来看看.

     state是从上一节提到的

synchronized DocumentsWriterThreadState getThreadState(Document doc, Term delTerm)

     中得到的, 我们进去看看... 原来是这一句话,

state = newArray[threadStates.length] = new DocumentsWriterThreadState(this);

     跟踪进去看看, DocumentWriterThreadState的构造函数, 发现了这一句:

consumer = docWriter.consumer.addThread(this);

     原来还是从docWriter中来的, 我们继续查看docWriter里面是怎样进行的初始化的.

DocumentsWriter(Directory directory, IndexWriter writer, IndexingChain indexingChain) throws IOException {

//...省略了

consumer = indexingChain.getChain(this);

if (consumer instanceof DocFieldProcessor) {

docFieldProcessor = (DocFieldProcessor) consumer;

}

}

    咱们再看看indexingChain.getChain(this)这个方法是怎么回事

    再跟踪进去, 就真相大白了:

DocConsumer getChain(DocumentsWriter documentsWriter) {

// Build up indexing chain:

 

final TermsHashConsumer termVectorsWriter = new TermVectorsTermsWriter(documentsWriter);

final TermsHashConsumer freqProxWriter = new FreqProxTermsWriter();

 

final InvertedDocConsumer termsHash = new TermsHash(documentsWriter, true, freqProxWriter,

new TermsHash(documentsWriter, false, termVectorsWriter, null));

final NormsWriter normsWriter = new NormsWriter();

final DocInverter docInverter = new DocInverter(termsHash, normsWriter);

return new DocFieldProcessor(documentsWriter, docInverter);

}

    这个就是一个非常典型的 装饰者 + 责任链 模式, 这样当我们运行:

final DocWriter perDoc = state.consumer.processDocument();

    时, 就会在IndexChain内部进行一系列的击鼓传花似的活动, 最终得到处理后的文档.

 

二. IndexChain的运转过程

    前面说了, IndexChian就是一个击鼓传花的过程, 那这个花是怎么传的呢? 让我们来揭开这个迷

    我画了一个流程图, 希望可以讲得更清楚一点, 另外我先说明一下图的颜色所代表的含义, 同样的颜色表示的是在同一个类中运行的过程. 箭头的指向表示过程或者关系, 比如说 DocInverterPerThread就是DocFieldProcessorPerThread的一个consumer. 前面的数字表示调用的顺序

image

     1)的入口就是processDocument, 下面调用了一系列的startDocument()函数,  这些函数的作用是对之后做postings所使用的consumer, processor进行初始化, 其实大部分的startDocument()内容为空, 显然, 这是Lucene的开发者为后面的人所预留的一个接口. 这6部可以认为是初始化的内容.

     然后下面一张图就是处理的一个具体内容了:

image

    先从类命名来说说吧. 可以大概看出, 跟consumer相关的类有几种主要的命名规则:

    1) 结尾带有Processor的,  这些类是一个基类, 负责调用结尾结尾是Consumer.

    2) 结尾带有Consumer的, 这些类通常被Processor来调用

    3) 结尾带有PerThread的, 这些类负责调用PerField的

    也可以认为, PerThread是负责调用一系列的PerField, 为什么这样设计我也不能完全说清楚, 如果有哪些朋友知道请指教.

 

接下来我将详细的说说TermHashPerField.add()方法, 这个方法是把一个Term加入到Posting表中的过程, 我非常希望能够理解大部分的内容, 如果有错误或者不清楚的地方也希望大家能够不吝赐教

转:https://www.cnblogs.com/LeftNotEasy/archive/2010/01/09/1643022.html



推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
author-avatar
mobiledu2502907423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有