<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>gyljfang</title>
    <description></description>
    <link>http://gyljfang.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>开放源代码的全文检索引擎Lucene(转载）</title>
        <author>gyljfang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gyljfang.javaeye.com">gyljfang</a>&nbsp;
          链接：<a href="http://gyljfang.javaeye.com/blog/152550" style="color:red;">http://gyljfang.javaeye.com/blog/152550</a>&nbsp;
          发表时间: 2008年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="Section1" style="layout-grid: 15.6pt none"><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" align="center" style="text-align: center"><strong><span style="font-size: 15pt; font-family: 宋体">开放源代码的全文检索引擎</span></strong><strong><span style="font-size: 15pt">Lucene</span></strong></p><p class="MsoNormal" style="text-indent: 257.25pt; margin-right: 21pt"><span style="font-family: 宋体">――介绍、系统结构与源码实现分析</span></p><p class="MsoNormal"><strong>第<span style="font-size: medium">一节 全文检索系统与Lucene简介&middot;&middot;&middot; 3</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是全文检索与全文检索系统？&middot;&middot;&middot; 3</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">二、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是Lucene？&middot;&middot;&middot; 4</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">三、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene的应用、特点及优势&middot;&middot;&middot; 4</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">四、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文的重点问题与cLucene项目&middot;&middot;&middot; 5</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">第二节 Lucene系统结构分析&middot;&middot;&middot; 5</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统结构组织&middot;&middot;&middot; 5</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">二、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据流分析&middot;&middot;&middot; 6</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">三、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于Lucene的应用开发&middot;&middot;&middot; 8</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">第三节 Lucene索引文件格式分析&middot;&middot;&middot; 9</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene源码实现分析的说明&middot;&middot;&middot; 9</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">二、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene索引文件格式&middot;&middot;&middot; 10</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">三、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些公用的基础类&middot;&middot;&middot; 12</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">四、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存储抽象&middot;&middot;&middot; 13</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">五、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于cLucene项目&middot;&middot;&middot; 15</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">第四节 Lucene索引构建逻辑模块分析&middot;&middot;&middot; 15</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绪论&middot;&middot;&middot; 15</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">二、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象体系与UML图&middot;&middot;&middot; 16</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">1．&nbsp;&nbsp;&nbsp;&nbsp; 项（Term）&middot;&middot;&middot; 16</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">2．&nbsp;&nbsp;&nbsp;&nbsp; 域（Field）&middot;&middot;&middot; 17</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">3．&nbsp;&nbsp;&nbsp;&nbsp; 文档（document）&middot;&middot;&middot; 18</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">4．&nbsp;&nbsp;&nbsp;&nbsp; 段（segment）&middot;&middot;&middot; 19</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">5．&nbsp;&nbsp;&nbsp;&nbsp; IndexReader类与IndexWirter类&middot;&middot;&middot; 23</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">三、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据流逻辑&middot;&middot;&middot; 24</span></strong></p><p class="MsoNormal"><strong><span style="font-size: medium">四、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于cLucene项目</span></strong></p><a name="_Toc43005312"></a><a name="_Toc43005312"><strong><p class="MsoNormal" align="center" style="text-align: center"><a name="_Toc43005313"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span style="font-size: 14pt; font-family: 宋体">第一节</span></strong><strong><span style="font-size: 14pt"> </span></strong><strong><span style="font-size: 14pt; font-family: 宋体">全文检索系统与</span></strong><strong><span style="font-size: 14pt">Lucene</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">简介</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005314"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>一、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">什么是全文检索与全文检索系统？</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">全文检索是指</span><span style="font-family: 宋体">计算机索引程序通过扫描文章中的每一个词，对每一个词建立一个索引，指明该词在文章中出现的次数和位置，当用户查询时，检索程序就根据事先建立的索引进行查找，并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引，检索时将词分解为字的组合。对于各种不同的语言而言，字有不同的含义，比如英文中字与词实际上是合一的，而中文中字与词有很大分别。按词检索指对文章中的词，即语义单位建立索引，检索时按词检索，并且可以处理同义项等。英文等西方文字由于按照空白切分词，因此实现上与按字处理类似，添加同义处理也很容易。中文等东方文字则需要切分字词，以达到按词索引的目的，关于这方面的问题，是当前全文检索技术尤其是中文全文检索技术中的难点，在此不做详述。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说，全文检索需要具备建立索引和提供查询的基本功能，此外现代的全文检索系统还需要具有方便的用户接口、面向</span><span>WWW</span><sup><span>[1]</span></sup><span style="font-family: 宋体">的开发接口、二次应用开发接口等等。功能上，全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能，外围则由各种不同应用具有的功能组成。结构上，全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等，加上各种外围应用系统等等共同构成了全文检索系统。图</span><span>1.1</span><span style="font-family: 宋体">展示了上述全文检索系统的结构与功能。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image001.gif" height="426" alt="" width="661" /></span></span></span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">在上图中，我们看到：全文检索系统中最为关键的部分是全文检索引擎，各种应用程序都需要建立在这个引擎之上。一个全文检索应用的优异程度，根本上由全文检索引擎来决定。因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。另一个方面，一个优异的全文检索引擎，在做到效率优化的同时，还需要具有开放的体系结构，以方便程序员对整个系统进行优化改造，或者是添加原有系统没有的功能。比如在当今多语言处理的环境下，有时需要给全文检索系统添加处理某种语言或者文本格式的功能，比如在英文系统中添加中文处理功能，在纯文本系统中添加</span><span>XML<sup>[2]</sup></span><span style="font-family: 宋体">或者</span><span>HTML<sup>[3]</sup></span><span style="font-family: 宋体">格式的文本处理功能，系统的开放性和扩充性就十分的重要。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005315"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>二、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">什么是</span></strong><strong><span>Lucene</span></strong><strong><span style="font-family: 宋体">？</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span>Lucene</span><span style="font-family: 宋体">是</span><span>apache</span><span style="font-family: 宋体">软件基金会</span><sup><span>[4]</span><span> </span></sup><span>jakarta</span><span style="font-family: 宋体">项目组的一个子项目，是一个开放源代码</span><sup><span>[5]</span></sup><span style="font-family: 宋体">的全文检索引擎工具包，即它不是一个完整的全文检索引擎，而是一个全文检索引擎的架构，提供了完整的查询引擎和索引引擎，部分文本分析引擎（英文与德文两种西方语言）。</span><span>Lucene</span><span style="font-family: 宋体">的目的是为软件开发人员提供一个简单易用的工具包，以方便的在目标系统中实现全文检索的功能，或者是以此为基础建立起完整的全文检索引擎。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span>Lucene</span><span style="font-family: 宋体">的原作者是</span><span>Doug Cutting</span><span style="font-family: 宋体">，他是一位资深全文索引</span><span>/</span><span style="font-family: 宋体">检索专家，曾经是</span><span>V-Twin</span><span style="font-family: 宋体">搜索引擎</span><sup><span>[6]</span></sup><span style="font-family: 宋体">的主要开发者，后在</span><span>Excite</span><sup><span>[7]</span></sup><span style="font-family: 宋体">担任高级系统架构设计师，目前从事于一些</span><span>Internet</span><span style="font-family: 宋体">底层架构的研究。早先发布在作者自己的</span><span><a href="http://www.lucene.com/">http://www.lucene.com/</a></span><span style="font-family: 宋体">，后来发布在</span><span><a href="http://sourceforge.net/projects/lucene/">SourceForge</a></span><sup><span>[8]</span></sup><span style="font-family: 宋体">，</span><span>2001</span><span style="font-family: 宋体">年年底成为</span><span>apache</span><span style="font-family: 宋体">软件基金会</span><span>jakarta</span><span style="font-family: 宋体">的一个子项目：</span><span><a href="http://jakarta.apache.org/lucene/">http://jakarta.apache.org/lucene/</a></span><span style="font-family: 宋体">。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005316"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>三、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span>Lucene</span></strong><strong><span style="font-family: 宋体">的应用、特点及优势</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">作为一个开放源代码项目，</span><span>Lucene</span><span style="font-family: 宋体">从问世之后，引发了开放源代码社群的巨大反响，程序员们不仅使用它构建具体的全文检索应用，而且将之集成到各种系统软件中去，以及构建</span><span>Web</span><span style="font-family: 宋体">应用，甚至某些商业软件也采用了</span><span>Lucene</span><span style="font-family: 宋体">作为其内部全文检索子系统的核心。</span><span>apache</span><span style="font-family: 宋体">软件基金会的网站使用了</span><span>Lucene</span><span style="font-family: 宋体">作为全文检索的引擎，</span><span>IBM</span><span style="font-family: 宋体">的开源软件</span><span>eclipse<sup>[9]</sup></span><span style="font-family: 宋体">的</span><span>2.1</span><span style="font-family: 宋体">版本中也采用了</span><span>Lucene</span><span style="font-family: 宋体">作为帮助子系统的全文索引引擎，相应的</span><span>IBM</span><span style="font-family: 宋体">的商业软件</span><span>Web Sphere<sup>[10]</sup></span><span style="font-family: 宋体">中也采用了</span><span>Lucene</span><span style="font-family: 宋体">。</span><span>Lucene</span><span style="font-family: 宋体">以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span>Lucene</span><span style="font-family: 宋体">作为一个全文检索引擎，其具有如下突出的优点：</span></span></span></p><p class="MsoNormal" style="margin-left: 44.95pt; text-indent: -23.95pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">（</span><span>1</span><span style="font-family: 宋体">）索引文件格式独立于应用平台。</span><span>Lucene</span><span style="font-family: 宋体">定义了一套以</span><span>8</span><span style="font-family: 宋体">位字节为基础的索引文件格式，使得兼容系统或者不同平台的应用能够共享建立的索引文件。</span></span></span></p><p class="MsoNormal" style="margin-left: 44.95pt; text-indent: -23.95pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">（</span><span>2</span><span style="font-family: 宋体">）在传统全文检索引擎的倒排索引的基础上，实现了分块索引，能够针对新的文件建立小文件索引，提升索引速度。然后通过与原有索引的合并，达到优化的目的。</span></span></span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">（</span><span>3</span><span style="font-family: 宋体">）优秀的面向对象的系统架构，使得对于</span><span>Lucene</span><span style="font-family: 宋体">扩展的学习难度降低，方便扩充新功能。</span></span></span></p><p class="MsoNormal" style="margin-left: 44.95pt; text-indent: -23.95pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">（</span><span>4</span><span style="font-family: 宋体">）设计了独立于语言和文件格式的文本分析接口，索引器通过接受</span><span>Token</span><span style="font-family: 宋体">流完成索引文件的创立，用户扩展新的语言和文件格式，只需要实现文本分析的接口。</span></span></span></p><p class="MsoNormal" style="margin-left: 44.95pt; text-indent: -23.95pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">（</span><span>5</span><span style="font-family: 宋体">）已经默认实现了一套强大的查询引擎，用户无需自己编写代码即使系统可获得强大的查询能力，</span><span>Lucene</span><span style="font-family: 宋体">的查询实现中默认实现了布尔操作、模糊查询（</span><span>Fuzzy Search<sup>[11]</sup></span><span style="font-family: 宋体">）、分组查询等等。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">面对已经存在的商业全文检索引擎，</span><span>Lucene</span><span style="font-family: 宋体">也具有相当的优势。首先，它的开发源代码发行方式（遵守</span><span>Apache Software License<sup>[12]</sup></span><span style="font-family: 宋体">），在此基础上程序员不仅仅可以充分的利用</span><span>Lucene</span><span style="font-family: 宋体">所提供的强大功能，而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践，进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上，商业软件的灵活性远远不及</span><span>Lucene</span><span style="font-family: 宋体">。其次，</span><span>Lucene</span><span style="font-family: 宋体">秉承了开放源代码一贯的架构优良的优势，设计了一个合理而极具扩充能力的面向对象架构，程序员可以在</span><span>Lucene</span><span style="font-family: 宋体">的基础上扩充各种功能，比如扩充中文处理能力，从文本扩充到</span><span>HTML</span><span style="font-family: 宋体">、</span><span>PDF<sup>[13]</sup></span><span style="font-family: 宋体">等等文本格式的处理，编写这些扩展的功能不仅仅不复杂，而且由于</span><span>Lucene</span><span style="font-family: 宋体">恰当合理的对系统设备做了程序上的抽象，扩展的功能也能轻易的达到跨平台的能力。最后，转移到</span><span>apache</span><span style="font-family: 宋体">软件基金会后，借助于</span><span>apache</span><span style="font-family: 宋体">软件基金会的网络平台，程序员可以方便的和开发者、其它程序员交流，促成资源的共享，甚至直接获得已经编写完备的扩充功能。最后，虽然</span><span>Lucene</span><span style="font-family: 宋体">使用</span><span>Java</span><span style="font-family: 宋体">语言写成，但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现（例如</span><span>.net framework<sup>[14]</sup></span><span style="font-family: 宋体">），在遵守</span><span>Lucene</span><span style="font-family: 宋体">索引文件格式的基础上，使得</span><span>Lucene</span><span style="font-family: 宋体">能够运行在各种各样的平台上，系统管理员可以根据当前的平台适合的语言来合理的选择。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005317"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>四、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">本文的重点问题与</span></strong><strong><span>cLucene</span></strong><strong><span style="font-family: 宋体">项目</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">作为中国人民大学信息学院</span><span>99</span><span style="font-family: 宋体">级本科生的一个毕业设计项目，我们对</span><span>Lucene</span><span style="font-family: 宋体">进行了深入的研究，包括系统的结构，索引文件结构，各个部分的实现等等。并且我们启动了</span><span>cLucene</span><span style="font-family: 宋体">项目，做为一个</span><span>Lucene</span><span style="font-family: 宋体">的</span><span>C++</span><span style="font-family: 宋体">语言的重新实现，以期望带来更快的速度和更加广泛的应用范围。我们先分析了系统结构，文件结构，然后在研究各个部分的具体实现的同时开始进行的</span><span>cLucene</span><span style="font-family: 宋体">实现。限于时间的限制，到本文完成为止，</span><span>cLucene</span><span style="font-family: 宋体">项目并没有完成，对于</span><span>Lucene</span><span style="font-family: 宋体">的具体实现部分也仅仅完成到了索引引擎部分。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">接下来的部分，本文将对</span><span>Lucene</span><span style="font-family: 宋体">的系统结构、文件结构、索引引擎部分做一个彻底的分析。以期望提供对</span><span>Lucene</span><span style="font-family: 宋体">全文检索引擎的系统架构和部分程序实现的清晰的了解。</span><span>cLucene</span><span style="font-family: 宋体">项目则作为一个开放源代码的项目，继续进行的开发。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">有关</span><span>cLucene</span><span style="font-family: 宋体">项目的一些信息：</span></span></span></p><p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: Wingdings">n<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">开发语言：</span><span>ISO C++<sup>[15]</sup></span><span style="font-family: 宋体">，</span><span>STLport 4.5.3<sup>[16]</sup></span><span style="font-family: 宋体">，</span><span>OpenTop 1.1<sup>[17]</sup></span></span></span></p><p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: Wingdings">n<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">目标平台：</span><span>Win32</span><span style="font-family: 宋体">，</span><span>POSIX</span></span></span></p><p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: Wingdings">n<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">授权协议：</span><span>GNU General Public License (GPL)<sup>[18]</sup></span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" align="center" style="text-align: center"><a name="_Toc43005318"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span style="font-size: 14pt; font-family: 宋体">第二节</span></strong><strong><span style="font-size: 14pt"> Lucene</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">系统结构分析</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005319"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>一、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">系统结构组织</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span>Lucene</span><span style="font-family: 宋体">作为一个优秀的全文检索引擎，其系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式，其次通过抽象将系统的核心组成部分设计为抽象类，具体的平台实现部分设计为抽象类的实现，此外与具体平台相关的部分比如文件存储也封装为类，经过层层的面向对象式的处理，最终达成了一个低耦合高效率，容易二次开发的检索引擎系统。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">以下将讨论</span><span>Lucene</span><span style="font-family: 宋体">系统的结构组织，并给出系统结构与源码组织图：</span></span></span></p><p class="MsoNormal"><span><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image002.gif" height="387" alt="" width="661" /></span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">从图中我们清楚的看到，</span><span>Lucene</span><span style="font-family: 宋体">的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。</span><span>Lucene</span><span style="font-family: 宋体">的将所有源码分为了</span><span>7</span><span style="font-family: 宋体">个模块（在</span><span>java</span><span style="font-family: 宋体">语言中以包即</span><span>package</span><span style="font-family: 宋体">来表示），各个模块所属的系统部分也如上图所示。需要说明的是</span><span>org.apache.lucene.queryPaser</span><span style="font-family: 宋体">是做为</span><span>org.apache.lucene.search</span><span style="font-family: 宋体">的语法解析器存在，不被系统之外实际调用，因此这里没有当作对外接口看待，而是将之独立出来。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">从面象对象的观点来考察，</span><span>Lucene</span><span style="font-family: 宋体">应用了最基本的一条程序设计准则：引入额外的抽象层以降低耦合性。首先，引入对索引文件的操作</span><span>org.apache.lucene.store</span><span style="font-family: 宋体">的封装，然后将索引部分的实现建立在（</span><span>org.apache.lucene.index</span><span style="font-family: 宋体">）其之上，完成对索引核心的抽象。在索引核心的基础上开始设计对外的接口</span><span>org.apache.lucene.search</span><span style="font-family: 宋体">与</span><span>org.apache.lucene.analysis</span><span style="font-family: 宋体">。在每一个局部细节上，比如某些常用的数据结构与算法上，</span><span>Lucene</span><span style="font-family: 宋体">也充分的应用了这一条准则。在高度的面向对象理论的支撑下，使得</span><span>Lucene</span><span style="font-family: 宋体">的实现容易理解，易于扩展。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; Lucene</span><span style="font-family: 宋体">在系统结构上的另一个特点表现为其引入了传统的客户端服务器结构以外的的应用结构。</span><span>Lucene</span><span style="font-family: 宋体">可以作为一个运行库被包含进入应用本身中去，而不是做为一个单独的索引服务器存在。这自然和</span><span>Lucene</span><span style="font-family: 宋体">开放源代码的特征分不开，但是也体现了</span><span>Lucene</span><span style="font-family: 宋体">在编写上的本来意图：提供一个全文索引引擎的架构，而不是实现。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005320"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>二、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">数据流分析</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">理解</span><span>Lucene</span><span style="font-family: 宋体">系统结构的另一个方式是去探讨其中数据流的走向，并以此摸清楚</span><span>Lucene</span><span style="font-family: 宋体">系统内部的调用时序。在此基础上，我们能够更加深入的理解</span><span>Lucene</span><span style="font-family: 宋体">的系统结构组织，以方便以后在</span><span>Lucene</span><span style="font-family: 宋体">系统上的开发工作。这部分的分析，是深入</span><span>Lucene</span><span style="font-family: 宋体">系统的钥匙，也是进行重写的基础。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp; </span><span style="font-family: 宋体">我们来看看在</span><span>Lucene</span><span style="font-family: 宋体">系统中的主要的数据流以及它们之间的关系图：</span></span></span></p><span style="margin-top: 311px; z-index: 18; left: 0px; margin-left: 419px; width: 78px; position: absolute; height: 58px"><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td height="58" bgcolor="#ffffff" style="background: white; vertical-align: top; border: black 0.75pt solid" width="78"><span style="z-index: 18; left: 0pt; position: absolute"><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt"><p class="MsoNormal"><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">索引查找逻辑</span></span></span></p></div></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium">&nbsp;</span></span></td></tr></tbody></table></span><span style="margin-top: 103px; z-index: 13; left: 0px; margin-left: 407px; width: 90px; position: absolute; height: 58px"><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td height="58" bgcolor="#ffffff" style="background: white; vertical-align: top; border: black 0.75pt solid" width="90"><span style="z-index: 13; left: 0pt; position: absolute"><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt"><p class="MsoNormal"><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">索引构建逻辑</span></span></span></p></div></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium">&nbsp;</span></span></td></tr></tbody></table></span><span style="margin-top: 217px; z-index: 17; left: 0px; margin-left: 299px; width: 102px; position: absolute; height: 58px"><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td height="58" bgcolor="#ffffff" style="background: white; vertical-align: top; border: black 0.75pt solid" width="102"><span style="z-index: 17; left: 0pt; position: absolute"><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt"><p class="MsoNormal"><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">查询语句语法分析逻辑</span></span></span></p></div></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium">&nbsp;</span></span></td></tr></tbody></table></span><span style="margin-top: 155px; z-index: 11; left: 0px; margin-left: 203px; width: 78px; position: absolute; height: 58px"><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td height="58" bgcolor="#ffffff" style="background: white; vertical-align: top; border: black 0.75pt solid" width="78"><span style="z-index: 11; left: 0pt; position: absolute"><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt"><p class="MsoNormal"><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">词法分析逻辑</span></span></span></p></div></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium">&nbsp;</span></span></td></tr></tbody></table></span><span style="margin-top: 301px; z-index: 16; left: 0px; margin-left: 71px; width: 114px; position: absolute; height: 78px"><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image003.gif" height="78" alt="流程图：文档: 查询结果" width="114" /></span></span></span><span style="margin-top: 207px; z-index: 15; left: 0px; margin-left: 71px; width: 114px; position: absolute; height: 58px"><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image004.gif" height="58" alt="流程图：顺序访问存储器: 查询语句" width="114" /></span></span></span><span style="margin-top: 197px; z-index: 14; left: 0px; margin-left: 539px; width: 90px; position: absolute; height: 37px"><span style="font-size: x-small"><span style="font-size: medium"> </span></span><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td height="37" bgcolor="#ffffff" style="background: white; vertical-align: top; border: black 0.75pt solid" width="90"><span style="z-index: 14; left: 0pt; position: absolute"><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt"><p class="MsoNormal"><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">存储抽象</span></span></span></p></div></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium">&nbsp;</span></span></td></tr></tbody></table></span><span style="margin-top: 51px; z-index: 12; left: 0px; margin-left: 527px; width: 114px; position: absolute; height: 89px"><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image005.gif" height="89" alt="流程图：多文档: 索引文件" width="114" /></span></span></span><span style="margin-top: 51px; z-index: 10; left: 0px; margin-left: 71px; width: 114px; position: absolute; height: 89px"><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image006.gif" height="89" alt="流程图：多文档: 被索引文件" width="114" /></span></span></span><span style="font-size: x-small"><span style="font-size: medium"><span><img src="http://lucene.cn/images/image007.gif" height="480" alt="" width="660" /></span> </span></span><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">图</span><span>2.2</span><span style="font-family: 宋体">很好的表明了</span><span>Lucene</span><span style="font-family: 宋体">在内部的数据流组织情况，并且沿着数据流的方向我们也可以对与</span><span>Lucene</span><span style="font-family: 宋体">内部的执行时序有一个清楚的了解。现在将图中的涉及到的流的类型与各个逻辑对应系统的相关部分的关系说明一下。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">图中共存在</span><span>4</span><span style="font-family: 宋体">种数据流，分别是文本流、</span><span>token</span><span style="font-family: 宋体">流、字节流与查询语句对象流。文本流表示了对于索引目标和交互控制的抽象，即用文本流表示了将要索引的文件，用文本流向用户输出信息；在实际的实现中，</span><span>Lucene</span><span style="font-family: 宋体">中的文本流采用了</span><span>UCS-2<sup>[19]</sup></span><span style="font-family: 宋体">作为编码，以达到适应多种语言文字的处理的目的。</span><span>Token</span><span style="font-family: 宋体">流是</span><span>Lucene</span><span style="font-family: 宋体">内部所使用的概念，是对传统文字中的词的概念的抽象，也是</span><span>Lucene</span><span style="font-family: 宋体">在建立索引时直接处理的最小单位；简单的讲</span><span>Token</span><span style="font-family: 宋体">就是一个词和所在域值的组合，后面在叙述文件格式时也将继续涉及到</span><span>token</span><span style="font-family: 宋体">，这里不详细展开。字节流则是对文件抽象的直接操作的体现，通过固定长度的字节（</span><span>Lucene</span><span style="font-family: 宋体">定义为</span><span>8</span><span style="font-family: 宋体">比特位长，后面文件格式将详细叙述）流的处理，将文件操作解脱出来，也做到了与平台文件系统的无关性。查询语句对象流则是仅仅在查询语句解析时用到的概念，它对查询语句抽象，通过类的继承结构反映查询语句的结构，将之传送到查找逻辑来进行查找的操作。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">图中的涉及到了多种逻辑，基本上直接对应于系统某一模块，但是也有跨模块调用的问题发生，这是因为</span><span>Lucene</span><span style="font-family: 宋体">的重用程度非常好，因此很多实现直接调用了以前的工作成果，这在某种程度上其实是加强了模块耦合性，但是也是为了避免系统的过于庞大和不必要的重复设计的一种折衷体现。词法分析逻辑对应于</span><span>org.apache.lucene.analysis</span><span style="font-family: 宋体">部分。查询语句语法分析逻辑对应于</span><span>org.apache.lucene.queryParser</span><span style="font-family: 宋体">部分，并且调用了</span><span>org.apache.lucene.analysis</span><span style="font-family: 宋体">的代码。查询结束之后向评分排序逻辑输出</span><span>token</span><span style="font-family: 宋体">流，继而由评分排序逻辑处理之后给出文本流的结果，这一部分的实现也包含在了</span><span>org.apache.lucene.search</span><span style="font-family: 宋体">中。索引构建逻辑对应于</span><span>org.apache.lucene.index</span><span style="font-family: 宋体">部分。索引查找逻辑则主要是</span><span>org.apache.lucene.search</span><span style="font-family: 宋体">，但是也大量的使用了</span><span>org.apache.lucene.index</span><span style="font-family: 宋体">部分的代码和接口定义。存储抽象对应于</span><span>org.apache.lucene.store</span><span style="font-family: 宋体">。没有提到的模块则是做为系统公共基础设施存在。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005321"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>三、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-family: 宋体">基于</span></strong><strong><span>Lucene</span></strong><strong><span style="font-family: 宋体">的应用开发</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">通过以上的系统结构分析和数据流分析，我们已经很清楚的了解了</span><span>Lucene</span><span style="font-family: 宋体">的系统的结构特征。在此基础上，我们可以通过扩充</span><span>Lucene</span><span style="font-family: 宋体">系统来完成一个完备的全文检索引擎，紧接着还可以在全文检索引擎的基础上构建各种应用系统。鉴于本文的目的并不在此，以下我们只是略为叙述一下相关的步骤，从而给出应用开发的一些思路。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">首先，我们需要的是按照目标语言的词法结构来构建相应的词法分析逻辑，实现</span><span>Lucene</span><span style="font-family: 宋体">在</span><span>org.apache.lucene.analysis</span><span style="font-family: 宋体">中定义的接口，为</span><span>Lucene</span><span style="font-family: 宋体">提供目标系统所使用的语言处理能力。</span><span>Lucene</span><span style="font-family: 宋体">默认的已经实现了英文和德文的简单词法分析逻辑（按照空格分词，并去除常用的语法词，如英语中的</span><span>is</span><span style="font-family: 宋体">，</span><span>am</span><span style="font-family: 宋体">，</span><span>are</span><span style="font-family: 宋体">等等）。在这里，主要需要参考实现的接口在</span><span>org.apache.lucene.analysis</span><span style="font-family: 宋体">中的</span><span>Analyzer.java</span><span style="font-family: 宋体">和</span><span>Tokenizer.java</span><span style="font-family: 宋体">中定义，</span><span>Lucene</span><span style="font-family: 宋体">提供了很多英文规范的实现样本，也可以做为实现时候的参考资料。其次，需要按照被索引的文件的格式来提供相应的文本分析逻辑，这里是指除开词法分析之外的部分，比如</span><span>HTML</span><span style="font-family: 宋体">文件，通常需要把其中的内容按照所属于域分门别类加入索引，这就需要从</span><span>org.apache.lucene.document</span><span style="font-family: 宋体">中定义的类</span><span>document</span><span style="font-family: 宋体">继承，定义自己的</span><span>HTMLDocument</span><span style="font-family: 宋体">类，然后就可以将之交给</span><span>org.apache.lucene.index</span><span style="font-family: 宋体">模块来写入索引文件。完成了这两步之后，</span><span>Lucene</span><span style="font-family: 宋体">全文检索引擎就基本上完备了。这个过程可以用下图表示：</span></span></span></p><p class="MsoNormal"><span><span style="font-size: x-small"><span style="font-size: medium"><img src="http://lucene.cn/images/image008.gif" height="389" alt="" width="664" /></span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">当然，上面所示的仅仅只是对于</span><span>Lucene</span><span style="font-family: 宋体">的基本扩充过程，它将</span><span>Lucene</span><span style="font-family: 宋体">由不完备的变成完备的（尤其是对于非英语的语言检索）。除此之外我们还可以在很多方面对</span><span>Lucene</span><span style="font-family: 宋体">进行改造。第一个方面即为按照文档索引的域，比如标题，作者之类的信息对返回的查询结果排序，这即需要改造</span><span>Lucene</span><span style="font-family: 宋体">的评分排序逻辑。默认的，</span><span>Lucene</span><span style="font-family: 宋体">采用其内部的相关性方法来处理评分和排序，我们可以根据需要改变它。遗憾的是，这部分</span><span>Lucene</span><span style="font-family: 宋体">并没有做到如同扩充词法解析和文档类型那样的条理清晰，没有留下很好的接口，因此需要仔细的分析其源代码的实现，自行扩充等等。其他的方面，比如改进其索引的效率，改进其返回结果时候的缓冲机制等等，都是加强</span><span>Lucene</span><span style="font-family: 宋体">系统的方面，在此也不再叙述。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">完成了</span><span>Lucene</span><span style="font-family: 宋体">系统，之后就可以开始考虑其上的应用系统开发。如果应用系统也使用</span><span>java</span><span style="font-family: 宋体">语言开发，那么</span><span>Lucene</span><span style="font-family: 宋体">系统能够方便的嵌入到整个系统中去，作为一个</span><span>API</span><span style="font-family: 宋体">集来调用。这个过程十分简单，以下便是一个示例程序，配合注释理解起来很容易。</span></span></span></p><span style="margin-top: 562px; z-index: 19; left: 0px; margin-left: 240px; width: 196px; position: absolute; height: 35px"><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td height="35" style="vertical-align: top" width="196"><span style="z-index: 19; left: 0pt; position: absolute"><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt"><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">图</span><span> 2.4 Lucene</span><span style="font-family: 宋体">应用代码示例</span></span></span></p></div></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium">&nbsp;</span></span></td></tr></tbody></table></span><span style="font-size: x-small"><span style="font-size: medium"><span><img src="http://lucene.cn/images/image009.gif" height="602" alt="文本框: public class IndexFiles { 
  //使用方法：: IndexFiles [索引输出目录] [索引的文件列表] ... 
  public static void main(String[] args) throws Exception {
    String indexPath = args[0];
    IndexWriter writer;
    //用指定的语言分析器构造一个新的写索引器（第3个参数表示是否为追加索引）
    writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);

    for (int i=1; i&lt;args.length; i++) {
      System.out.println(&quot;Indexing file &quot; + args[i]);
      InputStream is = new FileInputStream(args[i]);

      //构造包含2个字段Field的Document对象
      //一个是路径path字段，不索引，只存储
      //一个是内容body字段，进行全文索引，并存储
      Document doc = new Document();
      doc.add(Field.UnIndexed(&quot;path&quot;, args[i]));
      doc.add(Field.Text(&quot;body&quot;, (Reader) new InputStreamReader(is)));
      //将文档写入索引
      writer.addDocument(doc);
      is.close();
    };
    //关闭写索引器
    writer.close();
  }
}
" width="664" /></span> </span></span><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">或者，</span><span>Lucene</span><span style="font-family: 宋体">全文检索引擎也可作为服务器程序启动，但是这就需要用户自行扩充其他应用与</span><span>Lucene</span><span style="font-family: 宋体">的接口。这个可以通过传统的包装方式，比如客户服务器结构，或者采用现在流行的</span><span>Web</span><span style="font-family: 宋体">方式。诸如此类的应用方案，本文也不再继续叙述。参考</span><span>Lucene</span><span style="font-family: 宋体">的项目网站中的用户邮件列表能找到更多的信息。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" align="center" style="text-align: center"><a name="_Toc43005322"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span style="font-size: 14pt; font-family: 宋体">第三节</span></strong><strong><span style="font-size: 14pt"> Lucene</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">索引文件格式分析</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005323"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>一、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span>Lucene</span></strong><strong><span style="font-family: 宋体">源码实现分析的说明</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">通过以上对</span><span>Lucene</span><span style="font-family: 宋体">系统结构的分析，我们已经大致的清楚了</span><span>Lucene</span><span style="font-family: 宋体">系统的组成，以及在</span><span>Lucene</span><span style="font-family: 宋体">系统之上的开发步骤。接下来，我们试图来分析</span><span>Lucene</span><span style="font-family: 宋体">项目（采用</span><span>Lucene 1.2</span><span style="font-family: 宋体">版本）的源码实现，考察其实现的细节。这不仅仅是我们尝试用</span><span>C++</span><span style="font-family: 宋体">语言重新实现</span><span>Lucene</span><span style="font-family: 宋体">的必须工作，也是进一步做</span><span>Lucene</span><span style="font-family: 宋体">开发工作的必要准备。因此，这一部分所涉及到的内容，对于</span><span>Lucene</span><span style="font-family: 宋体">上的应用开发也是有价值的，尤其是本部分所做的文件格式分析。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">由于本文建立在我们的毕设项目之上，且同时我们需要实现</span><span>cLucene</span><span style="font-family: 宋体">项目，因此很遗憾的我们并没有完全的完成</span><span>Lucene</span><span style="font-family: 宋体">的所有源码实现的分析工作。接下来的部分，我们将涉及的部分为</span><span>Lucene</span><span style="font-family: 宋体">文件格式分析，</span><span>Lucene</span><span style="font-family: 宋体">中的存储抽象模块分析，以及</span><span>Lucene</span><span style="font-family: 宋体">中的索引构建逻辑模块分析。这一部分，我们主要涉及到的是文件格式分析与存储抽象模块分析。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt"><a name="_Toc43005324"></a><span style="font-size: x-small"><span style="font-size: medium"><strong><span>二、<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span>Lucene</span></strong><strong><span style="font-family: 宋体">索引文件格式</span></strong></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-family: 宋体">在</span><span>Lucene</span><span style="font-family: 宋体">的</span><span>web</span><span style="font-family: 宋体">站点上，有关于</span><span>Lucene</span><span style="font-family: 宋体">的文件格式的规范，其规定了</span><span>Lucene</span><span style="font-family: 宋体">的文件格式采取的存储单位、组织结构、命名规范等等内容，但是它仅仅是一个规范说明，并没有从实现者角度来衡量这个规范的实现。因此，我们以下的内容，结合了我们自己的分析与文件格式的定义规范，以期望给出一个更加清晰的文件格式说明。具体的文档规范可以参考后面的文献</span><span>2</span><span style="font-family: 宋体">。</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">首先在</span><span>Lucene</span><span style="font-family: 宋体">的文件格式中，以字节为基础，定义了如下的数据类型：</span></span></span></p><p class="MsoNormal">&nbsp;</p><p class="MsoNormal" align="center" style="text-align: center"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-size: 9pt; font-family: 宋体">表</span><span style="font-size: 9pt"> 3.1 Lucene</span><span style="font-size: 9pt; font-family: 宋体">文件格式中定义的数据类型</span></span></span></p><div align="center"><table class="MsoTableGrid" cellspacing="0" border="1" style="border-collapse: collapse; border: medium none" cellpadding="0"><tbody><tr><td valign="top" style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 77.1pt; padding-top: 0cm; border: windowtext 1pt solid" width="103"><p class="MsoNormal"><strong><span style="font-size: 9pt; font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">数据类型</span></span></span></strong></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="144"><p class="MsoNormal"><strong><span style="font-size: 9pt; font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">所占字节长度（字节）</span></span></span></strong></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 285.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="380"><p class="MsoNormal"><strong><span style="font-size: 9pt; font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">说明</span></span></span></strong></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 77.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="103"><p class="MsoNormal"><span style="font-size: 9pt"><span style="font-size: x-small"><span style="font-size: medium">Byte</span></span></span></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="144"><p class="MsoNormal"><span style="font-size: 9pt"><span style="font-size: x-small"><span style="font-size: medium">1</span></span></span></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 285.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="380"><p class="MsoNormal"><span style="font-size: 9pt; font-family: 宋体"><span style="font-size: x-small"><span style="font-size: medium">基本数据类型，其他数据类型以此为基础定义</span></span></span></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 77.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="103"><p class="MsoNormal"><span style="font-size: 9pt"><span style="font-size: x-small"><span style="font-size: medium">UInt32</span></span></span></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="144"><p class="MsoNormal"><span style="font-size: 9pt"><span style="font-size: x-small"><span style="font-size: medium">4</span></span></span></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 285.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="380"><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-size: 9pt">32</span><span style="font-size: 9pt; font-family: 宋体">位无符号整数，高位优先</span></span></span></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 77.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="103"><p class="MsoNormal"><span style="font-size: 9pt"><span style="font-size: x-small"><span style="font-size: medium">UInt64</span></span></span></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 108pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="144"><p class="MsoNormal"><span style="font-size: 9pt"><span style="font-size: x-small"><span style="font-size: medium">8</span></span></span></p></td><td valign="top" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 285.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="380"><p class="MsoNormal"><span style="font-size: x-small"><span style="font-size: medium"><span style="font-size: 9pt">64</span><span style="font-size: 9pt; font-family: 宋体">位无符号整数，高位优先</span></span></span></p></td></tr></tbody></table></div></strong></a></div>
          <br/>
          <span style="color:red;">
            <a href="http://gyljfang.javaeye.com/blog/152550#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jan 2008 10:22:20 +0800</pubDate>
        <link>http://gyljfang.javaeye.com/blog/152550</link>
        <guid>http://gyljfang.javaeye.com/blog/152550</guid>
      </item>
  </channel>
</rss>