您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > Lucene开发手册
昆明南天电脑系统有限公司2010年8月LUCENE开发部署指导手册昆明南天开发中心编者:陈俊南天WebDT部署开发手册1昆明南天电脑系统有限公司0871-33105180871-3318867第1章引言1.1前言编制本手册的目的:1.描述Lucene用途,使开发人员依据本手册初步认识Lucene;2.描述Lucene的API,使开发人员可以快速认识并利用Lucene开发搜索引擎;3.描述Lucene和webdt的融合;4.重点描述Lucene的应用,使开发人员可按照本手册的描述开发。本手册面向的读者:熟悉Java开发,并对WEBDT软件的特点(请参阅《技术白皮书》)具有初步认识的技术人员。1.2概述本手册首先介绍了Lucene的概念,详细描述了简单快速地将Lucene融入WEBDT运行平台并进行实际开发的方法,使技术人员对Lucene有一个概要性的框架认识,为下一步开发工作奠定基础。第2章LUCENE简介2.1什么是LUNCENELucene是一套javaAPI,就如同Servlet是一套API一样。Lucene不是一个独立的搜索引擎系统,但是你可以使用Luncene来开发搜索引擎系统。这正如Servlet不是网站系统但是你可以用Servlet开发网站一样。有人已经用Lucene开发出了独立的搜索引擎系统,你可以下载,然后不写南天WebDT部署开发手册2昆明南天电脑系统有限公司0871-33105180871-3318867一行代码就是用它。Nutch是最出名的了。Lucene是一个全文搜索框架,而不是应用产品。因此它并不像那么拿来就能用,它只是提供了一种工具让你能实现这些产品。2.2LUNCENE能做什么要回答这个问题,先要了解Lucene的本质。实际上Lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个数据库表的若干个字段索引起来,那就不用再担心因为“%like%”而锁表了;你也可以写个自己的搜索引擎……2.3你该不该选择Lucene下面给出一些测试数据,如果你觉得可以接受,那么可以选择。测试一:250万记录,300M左右文本,生成索引380M左右,800线程下平均处理时间300ms。测试二:37000记录,索引数据库中的两个Varchar字段,索引文件2.6M,800线程下平均处理时间1.5ms。第3章LUCENE的概述3.1下载LUCENE进入Lucene的主页:。可以从主页中单击“freedownload”链接,从而转入页面,这是网站为访问者推荐的最佳镜像地址,从这里往往可以得到最快的下载速度。单击页面中推荐的镜像地址,进入Lucene的下载页面:。从页面中选择lucene-2.0.1.zip文件,这是Lucene的二进制文件。如果要下载其源代码,南天WebDT部署开发手册3昆明南天电脑系统有限公司0871-33105180871-3318867则选择lucene-2.1.0-src.zip。3.2LUCENE基本概念3.2.1AnalyzerAnalyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。3.2.2Document用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。3.2.3Field一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。南天WebDT部署开发手册4昆明南天电脑系统有限公司0871-33105180871-33188673.2.4Termterm是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。3.2.5Tockentocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。3.2.6Segment添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。3.3Lucene的结构Lucene包括core和sandbox两部分,其中core是Lucene稳定的核心部分,sandbox包含了一些附加功能,例如highlighter、各种分析器。Lucenecore有七个包:analysis,document,index,queryParser,search,store,util。3.3.1analysisAnalysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的StandardAnalyzer。3.3.2documentDocument包含文档的数据结构,例如Document类定义了存储文档的数据结构,Field类定义了Document的一个域。南天WebDT部署开发手册5昆明南天电脑系统有限公司0871-33105180871-33188673.3.3indexIndex包含了索引的读写类,例如对索引文件的segment进行写、合并、优化的IndexWriter类和对索引进行读取和删除操作的IndexReader类,这里要注意的是不要被IndexReader这个名字误导,以为它是索引文件的读取类,实际上删除索引也是由它完成,IndexWriter只关心如何将索引写入一个个segment,并将它们合并优化;IndexReader则关注索引文件中各个文档的组织形式。3.3.4queryParserQueryParser包含了解析查询语句的类,Lucene的查询语句和sql语句有点类似,有各种保留字,按照一定的语法可以组成各种查询。Lucene有很多种Query类,它们都继承自Query,执行各种特殊的查询,QueryParser的作用就是解析查询语句,按顺序调用各种Query类查找出结果。3.3.5SearchSearch包含了从索引中搜索结果的各种类,例如刚才说的各种Query类,包括TermQuery、BooleanQuery等就在这个包里。4.6storeStore包含了索引的存储类,例如Directory定义了索引文件的存储结构,FSDirectory为存储在文件中的索引,RAMDirectory为存储在内存中的索引,MmapDirectory为使用内存映射的索引。3.3.6UtilUtil包含一些公共工具类,例如时间和字符串之间的转换工具。3.4如何建索引3.4.1创建Field创建File的方法有很多种,下面是最常用的方法。Fieldfield=newField(Field名称,Field内容,存储方式,索引方式);这四个参数的含义如下:(1)Field名称就是为Field取得名字,类似数据表的字段名称。(2)Field内容就是该Field的内容,类似数据表的字段内容。南天WebDT部署开发手册6昆明南天电脑系统有限公司0871-33105180871-3318867(3)存储方式包括三种:不存储(Field.Store.NO)、完全存储(Field.Store.YES)和压缩存储(Field.Store.COMPRESS)通常,如果不担心索引太大的话,可以可以都使用完全存储的方式。但是,出于对性能的考虑,索引文件的内容是越小越好。因此,如果Field的内容很少就采用完全存储(如标题),如果Field的内容很多就采用不存储或压缩存储的方式(如正文)。(4)索引方式包括四种:不索引(Field.Store.NO)、索引但不分析(Filed.Index.NO_NORMS)、索引但不分词(Field.Index.UN_TOKENIZED)、分次并索引(Field.Index.TOKENIZED)。以新闻稿为例,通常我们会按照标题和全文进行模糊搜索,这类需要进行模糊搜索的字段就用Field.Index.TOKENIZED。通常我们会按照作者名称进行精确搜索,需要精心精确搜索的字段就用Field.Index.UN_TOKENIZED。对于那些只需要跟着搜索结果显示出来却不需要按照其内容进行搜索的字段,使用Field.Index.NO。3.4.2创建Document创建Document的方法如下:Documentdoc=newDocument();这个方法用来创建一个不含任何Field的空Document。如果想把Field添加到Document里面,只需使用add方法。例如doc.add(field);重复的使用这个方法,就可以将多个Field加入到一个Document里面。3.4.3创建IndexWriter创建IndexWriter的方法很多,下面是最常用的方法:IndexWriterwriter=newIndexWriter(存储索引的路径,分析器的实例);这两个参数的含义如下:(1)存储索引的路径就是索引被存储在硬盘上的物理路径。如:c:\my等。(2)分析器的实例。分析器是用来做词法分析的,包括英文分析器和中文分析器等。要根据所要建立索引的文件情况选择适当的分析器。常用的有StandardAnalyzer(标准分析器)、CJKAnaLyzer(二分法分析器)、ChineseAnlyzer(中文分析器)和FrenchAnalyzer(法语分析器)等。可以根据自己的需要去编写分析器,从而处理不同的语言文字。通过建立IndexWriter,就把逻辑索引核物理索引联系起来了,这样就可以很方便的建立索引。例如:IndexWriterwrier=newIndexWriter(“c:/my/index”,newCJK
本文标题:Lucene开发手册
链接地址:https://www.777doc.com/doc-2881493 .html