lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战lucene实战在我有了第个儿了 Jakob之后,我开始了数字照片档案的设计。我想开发套管理图片的系统可以给图片附加元数据,如关键字、拍摄日期。当然用我选择的尺寸定位图片是很容易的。在19世纪90年代末,我构建∫基于文件系统的原型,使用∫ Microsoft的技术,包括 MicrosoftIndex server、 Action Server Pages及处理图片的第三方COM组件。从那时起,我的职业生涯都消耗在这些类似的技术上了。 I was able to cobble together a compelling applicat ionin a couple of days of spare-time hacking我的职业转向Java技术,并且我越来越少地利用 Microsoft windows。为了以系统无关的方式用Java技术重新实现我的个人照片档案系统及搜索引擎,我使用了Luceηe。 Lucene的简单易用远远超过∫我的期望一我所期望的其它开源库或工具在概念上简单,但是却难以使用。在201年, Steve loughran和我开始编写 Java Development with Ant( Manning)。我们采用图片搜索引擎的思想,并把它推广为一个文档搜索引擎。这个程序示例在那本Ant书中使用,而且可被定制为图片搜索引擎。Ant的责任不仅来自于简单的编译打包的构建过程,也来自于定制的任务,< index>,我们在构建过程中使用 Lucene创建索引文件。Ant仼务现在生存在 Lucene的 Sandbox(沙箱)中,将在本书8.4节描述。Ant已经应用在我的博客系统中,我称为Blogscene(http://www.blogscene.org/erik)在建立一个博客实体之后,我运行一个Ant构建过程,索引新的实体并将它们上传到我的服务器上。我的博客服务器由一个 Servlet、一些验证模板和一个 Lucene索引组成,允许(rich)查询,甚至联合查询。与其它博客系统相比, BlogScene在特色和技巧上差很多,但是它的全文检索能力非常强大我现在效力于维古尼业大学对 Patacriticism的应用研究小组Chttp://www.patacriticism.org我用对文本分析、索引和拽索的经验通过讨论量子力学与艺术的关系来测试及拓展我的思路。“诗人是世界上不被认可的最伟大的工程听”来自 Otis gospodnetic我对信息搜索与管理的兴趣和热情开始于在 Middlebury大学的学生时代。那时候,我发现了信息的广大资源,即Web。尽管Web仍然刚开始发展,但是对收集、分析、索引和搜索的长期需求是很明显的。我开始对建立来自Web的信息库感到困惑,开始编写Web爬行器梦恕有种方法可以对这些收集的信息进行搜索。我认为在巨大的未知领域中搜索是杀手级软件。有了这种思想以后,我开始了一系列收集和搜索项目。在1995年,和同学 Marshall levin一起创建了 Webph,一个用来收集和找出个人联系信息的开源程序。基本上,这是一个简单的具有Web接口(CGI)的电话本,那时排在首位的类型。(实际上它在19世纪90年代末的案例学习中被引用为一个示例。)大学和政府机构是这个程序的主要用户,现在还有很多在使用它。在1997年使用我的 WebPh,我继续创建了 Populus,一个当时很流行的白贞。尽管技术(与 Webph类似)很普通,但是 Populus有很重的负担,并且能够与 WhoWhereBigfoot和 Infospace等大角色相媲美。在两个关于个人联系信息的项目之后,是该探索新的领域了。我开始了下一个冒险, Info jump,用来在网上时事通讯、杂志、报纸中选择高质量的信息、。我拥有的软件由大量的Perl模块和脚本组戊,1 nfo jump.利用一个称作 Webinator的web爬行器和一个全文搜索的产品叫作 Texas。在1998年Infojump提供的服务很像今天的Findarticles.com尽管 Webph、 Populus和 Info jump达到了它们的目的并是功能很完善,但它们都有技术的局限性。它们缺少的是一个用反向索引来支持全文搜索强大的信息搜索库。为了不重复相同的工作,我开始搜寻一个我认为不可能存在的解决方案。在2000年早期,我发现了 Lucene,我正在寻找的缺少的部分,并且我一下子就喜欢上了它。我在 Lucene还在 Sourceforge的时候就加入了这个项目,后米202年 Lucene转移到 Apache.件基佥会。我对 Lucene的热爱是因为这些年来它已经成为我很多思想的核心组件。这些思想中的一个是 Simpy,我最近的个项目。 Simpy是个有许多特点的个性Web服务,可以让用户加标签、索引、搜索和共享在网上找到的信息。它主要使用了 Lucene,上千条索引,由 Doug cutting的另一个项目 Nutch(第10章)提供动力支持。我对 Lucene的积极参与导致我被邀请与ErikHatcher共同编写 Lucene in action。Lucene in action有关于 Lucene最全面的信息。接下米的10章包含的信息围绕你使用 Lucene创建优秀程序所需的所有主题。这是它平坦且轻快的协作过程的结果,就像 Luc ene社区一样。Lucene和 Lucene in action让明了有类似兴趣的人们可以完成什么,不管在人生中会碰到什么情况,都会积极地为全球知识的共享做出贡献。致谢首先并且是最重要的,我们感谢我们的妻子 Carole(Erik)和 Margaret0tis),一直支持这本书的写作。没有她们的支持,这本书就不可能出版。Erik感谢他的两个儿子, Ethan和 Jakob,囚为他们的忍耐和理解,Erik写这本书时没有时间陪他们玩耍。我们真诚感谢 oug cutting。没有Doug的贡献,就不可能有 Lucene。没有其他 Lucene的贡献者,Lucene就会少很多特征、更多的Bug, Lucene的成长就会花更长的时间。感谢所有的贡献者,包括 Peter carlson、 Tal dayan、 Scott ganyo、 Eugene gluzberg、 Brian goetz、 ChristophGoller、 Mark harwook、 Tim Jones、 Daniel naber、 Andrew o.0 liver、 Dmitry serebrennikov、Kelvin tan和 Matt tucher。同时,我们感谢所有女献在第10章的案例的人: Dion alaerMichael cafarella、 Bob carpenter、 Karsten konrad、 Terence parr、 Robert selvaraj、RalfSteinbach、 Holger stenzhorn和 Craig Walls本书简介Lucene in action为使用最奷的Java开源搜索引擎的用户提供所有细节、最好的实饯、警告、技巧本书假设读者熟悉基本的Java编程。 Lucene本身是个Java档案(JAR)文件并能集成到简单的命令行程序和大型企业级应用程序中。Roadmap我们在本书第1部分覆盖 Lucene核心编稈接口(API)使你在将 Lucene整合到你的程序中时慝意使用它:n第1章,接触 Lucene。我们介绍了一些基本的信息搜索术语和 Lucene的主要竞争对手。我们很快地构建了一个你马上能用戌修改以适应需要的简单索引和搜索程序。这个示例程序向你打开了探索 Lucene其它能力的大门。第2章使你熟悉 Lucene基本的索引操作。我们描述了索引数值和日期的不同字段类型和各种技术。包括调整索引过程、优化索引以及如何处理线程安全第3章向你介绍基本的搜索,包括 Lucene如何根据查询来排列文档的细节。我们讨论基础的查询类型及匕们如何通过用户输入的查询表达式创建。第4章深入研究 Lucene的索引核心,分析过程。分析器创建块及单词、单词流和单词过滤器。我们创建了一些定制的分析器, showcasing synonym injection and metaphone(liksoundex) replacement.也分析了非英语语言,典型的分析汉字文本的示例。第5章讲述搜索章节剩余的。我们描述了一些高级的搜索特征,包括排序、过滤及使用词向量。高级的查询类型在此出现,包括 SpanQuery家族。最后,我们讨论了 Lucene对查询多索引的内建支持,并行的及远程的第6章超越髙级搜索,向你展示了如何扩展 Lucene的拽索能力。你将学到如何定制搜索结果的排序、扩展査询表达式分析、实现Hit收集和调整查询性能。第2部分超越 lUcene内建的工具并冋你展示围绕 Lucene可以做什么。第7章,我们创建了可重用、可扩展的用来分析Word、HTM、XML、PDF及其它格式文档的框架。第8章包括围绕 Lucene的扩展和上具。我们描述了一些 Lucene的索引查看和开发工具以及 Lucene沙箱中的好东西。高亮搜索项就是这和你想要的沙箱扩展,还有在At构建过稈中创建索引的其它工具。使用 noncore分析尜,并使用类似 WordNet的索引。第9章描述 Lucene翻详成其它各种语言的版本,如C艹+、C#、Perl和 Py lhor。第10章将 Lucene的技术细节带到大量优秀的案例学习中。这些案例由那些创建了以Lucene为核心的有趣的、快速的、可升级的程序的开发者提供。谁应该阅读本书?在稈序中需要强大搜索能力的开发人员需要阅读这本书。 Lucene in action适合于那些对Lucene或索引和搜索技术好奇的开发人员,他们可能不会马上就用到它。把 Lucene添加到你的工具箱对以后的项目米说是值得的一搜索是个热门的话题并且将米也会是。这本书主要使用Java版的 Lucene(米自 Apache jakarta),并且大多数示例使用Java。最适合熟悉Java的读者。Jaa经验是很有帮助的,然而 Lucene已经翻译成很多其它的语言包括C++、C#、Python和Perl。概念、技术甚至API本身都和Jav版 Lucene差不多。代码示例本书的源代码可以从Manning的网站http://www.manningcom/hatcher2上下载。代码的使用说明包含在代码包的 README文件书中出现的大多数代码是由我们编写并包含在代码包中。某些代码(尤其是案例代码)不在我们的代码包中提供。书中的代码片断归贡献者所有。同时,我们包含了 Lucene代码库的部分代码,基于 apache软件许可协议(hup://ww. apache.org/ licenses/ LICENSE-2.0)。代码示例不包括 package和 Import语句,以节省空间:具体请参照实际代码。为什么是 JUnit?我们相信书中的代码示例应该都是高质量的。典型的“ hello world”例子经常帮助读者测试他们的环境。我们使用独特的方法来使用书中的代码示例。大部分示例是实际的 JUnit测试用例http://www.junitorgJUnIt是Java单元测试框架,可以断言一个特殊情况是否能以可重复的方式出现。通过IDE或An进行自动Jnit测试用例可以一步一步地构筑系统。我们在本书用使用 JUnit是因为平时都在其它项目中使用,并想让你看看我们如何编码。测试驱动开发( Test Driven Development,TD)是我们强烈推荐的开发模式。如果你对JUni不熟,请阅读以下基础。我们也建议你阅读 Dave thomas和 Andy Hunt编著的《 Pragmatic Unit Testing in Java with JUniU》,还有 Vincent Massol和 Ted husted编著的《 JUnit in Action》JUnit基础这部分是对 I Unit快速但当然不完整的介绍。我们将提供理解我们示例代码所需的基础知识。首先,我们的Jnit测试用例继承 Juni t. framework. Test Case并且很多通过部 LiaTestcase基类间接继它。我们的具体测试类附合这个命名习惯:给类名加后缀TesL。例如,我们的 QueryParser的测试是 ueryParserTest. JavacJUnit自动执行所有类似 public void testXXX(的方法,此处XX是个任意有意义的名称。 JUnit测试方法必须简洁,保持好的设计。(例如创建可亘复的功能模块等等)断言JUni建立在ˉ组 assert语句上,使你自由编写简洁的测试代码并使 JUnit框架处理失败状态及指出细节。最常用的 assert语句是 assert Equals;一些是为不同的数据类型而重载的assertEquals方法。一个示例测试方法如下public void testExampleoSomeobject obj= new SomeObjectOassertEqueals(10, ob j someMethod ()如果指定的值(在本例中的10)不等于真实值(本例中是调用obj的 someMethod的返回值), assert方法出运行时异常。除了 assertequals,为了方便还有一些其他 assert方法。我们也使用assertTrue( expresslon)、 assertfalse( expresslon)和 assertNull( expression)语句。这些测试分别判断这个表达式是否是true、 false和nu1lasser语句有个接受一个附加的 String参数的重载表示。 String参数都是用来汇报的,在测试失败时向开发人员指出更多信息。我们使用这个 String消息参数以更好的描述通过以这种风格编写我们的测试用例,可以从我们构建大系统的复杂中解放出来,而且可以每次只关注更少的细节。利用合适的测试用例,我们能够增强信心和灵活性。信心来自于我们知道代码的变化如优化算法不会破坏系统的其它部分,因为出现这和情况的话,自动测试组件能让我们在它影响产品之前发现。重构是种改变代码内部结构的艺术(或者说科学),所以它能够适应变化的需求而又不影响系统的对外接口在上下文中的 JUnit让我们看一下到目前为止谈论的Juni并把它放到本书的上下文中。 JUnit测试用例继承Junit. framework. Testcase,且测试方法都类似 public void testXXX(形式。我们的测试用例之(第3章)如下:oublic class Bas icSearchingTesl extends Lia TestCase ipublic void testTerm() throws ExceptionIndeXScarcher searcher new IndexSearcher (directory)Term t- new Term(“ sub ject”,“ant”);Query query new TermQuery(t)llits hits searcher search(query)assertEquals(“JDwA”,1,hits. length o)ted forarch for“anthits= searcher. search(new TermQuery(t))Equals(2tho)/o hils expecled fesearcher, close o当然,我们将在之后解释这个测试用例中使用的! ucene API。现在我们只关注Jnit的细节。testTerm方法中的 directory变量没在此类中定义。JUni提供一个在执行每个测试方法之前的初始化钩子;这个钩子是名为 public void setUp()的方法。我们的 Liatestcase基类以这种方式实现 setUppublic abstract class LiaTestCase extends TestCase tprivate String indexDir- System getProperty( "index. dir")rotected directory directorytected void setUp throwsdirectFSDirectcDIrectory(indexDir, false)如果 testers中的第一个断言失败,我们会得到一个异常:junit. framework. Assertion FalsedError: JDwA expected: but was: (0>at lia. searching. Basic SearchingTeststerm(BasicSearchingl'est java: 20)这个失败指出我们的测试数据与预期的结果不同。测试 Lucene本书中的大部分测试都是测试 Lucene本身的。实际上,这是否现实呢?难道要测的不是我们自已写的代码而是库本身?有个 Test Driven Developmen的姊妹篇是用来学习API的:TestDriven Learning。它为新API写测试以了解它是如何工作以及你能从中得到什么时非常有帮助。这正是我们在大部分代码示例中所做的,所以测试都是测试 Lucene它本身。但是不要把这些为学习而做的测试抛开。保留它们以确保你在升级到新版的API或因API改变而重构时,它们能够保持真值。模型对象在一些用例中,我们使用模型对象米测试。模型对象用来作为探测器传入真实的业务逻辑,以判断这个业务逻辑是否正常工作。例如,第4章中有个 SynonymEngine接口(4.6节)。使用这个接∏的真实业务逻辑是个分析器。当我们想测试这个分析器本身时, SynonymEngine使用什么类型就不重要,我们只想使用一个定义良好并有可预见行为的对象。模型对象可以使得测试用例尽可能简单,这样它们每次只测试系统的一个方面,在测试失贩要修正什么错误时没有纠缠的依赖。使用模型对象的一个好处来自于设计的变动,例如关系的分离和设计使用接口代替直接具体实现。我们的测试数据为了避免每个小节都要用完全不同的数据,书中大部多都是围绕一组公共的示例数据以提供一致性。这些示例数据由书籍详细资料组成。表1显示了这些数据,你叮以参考它来理解我们的例表!本书中用到的示例数据Title/ authorSubjecta Modern art of educationRudolf steiner/education/ pedagogyeducation philosophypsychology practice WaldorfImperial secrets of heal thand logevityBob flaws/health/alternative/ Chinesediet chinese medicine qigong health herbsTao Te ching道德經Stephen Mitchell/philosophy/ easterntaoismGö: del, Escher, B:achan Eternal golden braidDoug las Hofstadter/technology/computers/aiartificial intelligence number theory mathematics musicMindstormsSeymour papert/technology/ computers/programming/ eductionhildren computers powerfuli deas logo eductionJava Development with antErik hatcherSteve Loughran/technology/computers/programmingapache jakarta ant build too ljunit java developmentJUnit in ActionVincent Massol. Ted llusted/technology/computers/programmingjunit unit lesting nockob ecLSLucene in actionOtis gospodnetic