第四章Lucene的索引与检索机制及其应用§4.1Lucene简介1Lucene简介•(课本P44-45)•Lucene-2.4.0.zip(即Lucene的Jar文件)以及Lucene-2.4.0-src.zip(即Lucene的源码)•有关Lucene的好书:《LuceneinAction》•另一本Lucene的好书:《Buildingsearchapplications》•有关Lucene中API的帮助文档•Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。是一个高性能、可伸缩的信息搜索API库。它使你可以为你的应用程序添加索引和搜索能力。–全文检索Æ是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。•Lucene是一个IR库而不是现成的产品,也不是web爬行器。它昀主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是昀重要的是使用者可以随时应自已需要自订其功能。Lucene压缩包的主要内容1.lucene-core-XX.jar:Thecompiledlucenelibrary.2.lucene-demos-XX.jar:Thecompiledsimpleexamplecode.3.luceneweb.war:ThecompiledsimpleexampleWebApplication.4.contrib/*:ContributedcodewhichextendsandenhancesLucene,butisnotpartofthecorelibrary.ItcontainsvariousanalyzersthatpeoplemayfindusefulinplaceoftheStandardAnalyzer.5.docs/index.html:ThecontentsoftheLucenewebsite.6.docs/api/index.html:TheJavadocLuceneAPIdocumentation.Thisincludesthecorelibrary,thedemo,aswellasallofthecontribmodules.7.src/java:TheLucenesourcecode.8.src/demo:Someexamplecode.Lucene中主要包的对应功能包名功能org.apache.lucene.analysis语言分析器,主要用于的切词,支持中文主要是扩展此类org.apache.lucene.document索引存储时的文档结构管理,类似于关系型数据库的表结构org.apache.lucene.index索引管理,包括索引建立、删除等org.apache.lucene.queryParser查询分析器,实现查询关键词间的运算,如与、或、非等org.apache.lucene.search检索管理,根据查询条件,检索得到结果org.apache.lucene.store数据存储管理,主要包括一些底层的I/O操作org.apache.lucene.util一些公用类Lucene在搜索引擎开发的作用集成了Lucene的典型程序另一种结构形式为什么使用Lucene?•索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。•在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。•优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。•设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。•已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询等。•开源,可扩展能力强,有各种语言版本(但Java版本昀好用),适合各种平台全文检索和数据库检索的比较全文搜索数据库索引对文本建立关键字索引无法使用索引进行LIKE查询匹配效果按单词匹配,使用”ant”不会匹配”planting”无法按单词匹配,使用’%ant%’也会匹配”planting”匹配度有匹配度算法,搜索结果按匹配度从高到低排序无匹配度算法,无法按匹配度对搜索结果排序可定制性提供编程接口,容易定制索引规则只能使用SQL查询,无法定制Lucene和数据库中概念对比Lucene数据库Document一条存储记录,包含多个Field类似数据库表的Record记录Field一个字段的完整内容类似数据库表的Field字段Hits代表一个搜索结果,持有一个Document列表类似SQL查询的ResultSet结果集,包含多个RecordLucene中昀主要的结构Lucene的主要逻辑图主要特点:1.文本内容经切词后索引入库;2.根据查询条件返回结果完成信息检索任务的步骤1.文档解析:这个任务一般由相应的解析工具而非Lucene来完成。2.文本分析(详见课本P48):由于Lucene采用倒排索引作为其索引数据结构,因此Lucene必须先将文本信息切分成一个个的信息单元(即Token),再利用这些Token构造倒排索引。在Lucene中,文本内容分析(如分词)的工作是由Analyzer完成的。3.生成索引(详见课本P48-51):通过使用IndexWriter类可将文档转换成Token,并将Token写入到倒排文件中。在内容分析时,已经获得了一个Token在某个文件中出现的频率信息、位置信息等,所以只需将这些信息按照倒排文档的格式写入到文件中即可。生成索引时,Lucene还有可能使用一些压缩操作等。4.处理用户提交的检索词(课本P51-53):通过使用Query和QueryParser类来处理用户提交的检索词,可以完成模糊查询、语义查询、短语查询、范围查询、组合查询等多种检索操作。5.完成检索:检索主要由IndexSearcher完成。Lucene提供多种构建IndexSearcher对象的方法,如基于Directory的对象构建,以及基于文件系统的路径构建,详见后续示例程序。6.得到检索结果:检索结果集由Hits返回。通过Hits能获得与输入检索项相关的内容。§4.2Lucene部署与测试1配置环境变量•详见课本P45.•在系统环境变量ClassPath后边,加上Lucene的两个核心JAR包,如“d:\lucene-2.4.0\lucene-2.4.0\lucene-core-2.4.0.jar;d:\lucene-2.4.0\lucene-2.4.0\lucene-demos-2.4.0.jar”。•为验证是否成功加入到Classpath中,可在cmd窗口执行“echo%CLASSPATH%”,查看是否成功添加。2对LuceneDemo的测试1、控制台方式(课本P45-46)(1)建立索引。在控制台cmd方式下输入:“javaorg.apache.lucene.demo.IndexFiles“d:\workshop\docs””(设待索引文件在d:\workshop\docs下),则对目标文件夹(即d:\workshop\docs)下所有文件建立索引,同时在当前命令行所在位置将生成index文件夹。(2)javaorg.apache.lucene.demo.SearchFiles,则在当前路径下找index文件夹并进行检索,要在存放索引文件的父目录中执行上述语句。这时将会出现“EnterQuery:”提示符,在其后输入关键字后回车,即可得到查询结果,不支持中文检索。2、Web方式(课本P46-47):cmd模式下利用Lucene自带的Demo对指定位置的html文件建立索引并存放在指定的位置。(1)将D:\lucene-2.4.0\lucene-2.4.0\luceneweb.war复制到Tomcat安装路径的\webapps,输入,会打开lucene的自带的Demo程序。(2)在新建的这个luceneweb文件夹下新建一docs文件夹,将一些txt、html等类型的文件复制到这个docs中。(3)对指定路径下的文件建立索引。cmd下输:javaorg.apache.lucene.demo.IndexHTML–create–index“D:\eclipse\java\Tomcat5.5\webapps\luceneweb\index”“D:\eclipse\java\Tomcat5.5\webapps\luceneweb\docs”–第一个参数是存放索引的目的地,第二个参数是存放待索引的文件的源位置(4)为使Lucene的demo能找到索引文件,需修改Tomcat安装路径下的webapps\Luceneweb\configration.jsp,使之能指向正确的索引位置。修改“StringindexLocation”使之指向正确的Index文件夹,StringindexLocation=“..\\webapps\\luceneweb\\index”;(5)在Tomcat运行状态下,在浏览器中输入。在文本框中输入关键字,如“+Lucene+windows”,按照指定的与关系来进行检索。§4.3Lucene的索引与检索机制概述Lucene的索引方式1:RamDirectory内存中建立索引,此时需要在类文件的上方添加:importorg.apache.lucene.store.RAMDirectory;下面的部分示例代码演示了该索引的一种使用方式。(1)RAMDirectoryramdir=newRAMDirectory();(2)IndexWriterramWriter=newIndexWriter(ramdir,newStandardAnalyzer(),true);//在IndexWriter的构造函数中,第一个参数是有关索引位置的,如果采用FSDirectory方式,就要指定存放索引的位置;第二个参数是绑定分析器Analyze;第三个参数为设定是否用增量索引(true为删除原目录中所有内容新建索引;false为在原索引上追加索引即增量索引)。这里是采用StandardAnalyzer分词方式,参数true表明要删除目录内原有内容新建索引。(3)创建Document对象,并实例化为doc1(略)(4)通过doc1.add()方式向Documentdoc1中加入内容(略)(5)ramWriter.addDocument(doc1);//向内存索引中加入doc1(6)ramWriter.close();//关闭Lucene的索引方式2:FSDirectory方法1:在InderWriter(Stringpath,Analyzea,booleancreate)中直接指定路径字符串:(方案a)IndexWriterwriter1=newIndexWriter(C:\\index,newStandAnalyzer(),true);//直接给出未来存放索引的路径(方案b)IndexWriterTextIndex=newIndexWriter(Dest_Index_Path,newStandAnalyzer(),true);//在变量Dest_Index_Path中设定索引文件位置,昀后一个布尔值true说明删除原目录中所有内容新建索引方法