温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
2023
比较
Lucene
文章
Lucene构架全文搜索引擎
Lucene 历史
是一个基于 Java 的全文索引工具包,Lucene的奉献者 Doug Cutting 是一位资深全文索引/检索专家,曾经是 V-Twin 搜索引擎(Apple 的 Copland 操作系统的成就之一)的主要开发者,后在 Excite 担任高级系统架构设计师,目前从事于一些 Internet 底层架构的研究。他奉献出的 Lucene 的目标是为各种中小型应用程序参加全文检索功能。
Lucene 的开展历程:早先发布在作者自己的 lucene ,后来发布在 SourceForge,2023年年底成为 APACHE 基金会 Jakarta 的一个子项目。已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比拟著名的有:
Jive:WEB论坛系统;
Eyebrows:邮件列表 HTML 归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free〞作者就是 EyeBrows 系统的主要开发者 之一,而 EyeBrows 已经成为目前 APACHE 项目的主要邮件列表归档系统;
Cocoon:基于 XML 的 Web 发布框架,全文检索局部使用了Lucene;
Eclipse:基于 Java 的开放开发平台,帮助局部的全文索引使用了 Lucene。
Lucene优点
Lucene作为一个全文检索引擎,其具有如下突出的优点:
〔1〕索引文件格式独立于应用平台。Lucene定义了一套以8位字节为根底的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
〔2〕在传统全文检索引擎的倒排索引的根底上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,到达优化的目的。
〔3〕优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能
〔4〕设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
〔5〕已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询〔Fuzzy Search〕、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。首先,它的开发源代码发行方式〔遵守Apache Software License〕,在此根底上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践,进而在此根底上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及Lucene。其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的根底上扩充各种功能,比方扩充中文处理能力,从文本扩充到HTML、PDF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的到达跨平台的能力。最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。
后来有移植到各种平台和语言的版本。Ruby, .net平台的L, PHP里的Zend框架也集成Lucene全文搜索引擎。
Lucene建立索引
为了对文档进行索引,Lucene 提供了五个根底的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。
下面我们分别介绍一下这五个类的用途:
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field 对象是用来描述一个文档的某个属性的,比方一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer 在一个文档被索引之前,首先需要对文档内容进行分词处理,这局部工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter 是 Lucene 用来创立索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory 这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
Lucene搜索结果
Lucene提供了几个根底的类来完成这个过程,它们分别是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介绍这几个类的功能。
Query这是一个抽象类,他有多个实现,比方TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。
Term 是搜索的根本单位,一个Term对象有两个String类型的域组成。生成一个Term对象可以有如下一条语句来完成:Term term = new Term(“fieldName〞,〞queryWord〞); 其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。
TermQuery是抽象类Query的一个子类,它同时也是Lucene支持的最为根本的一个查询类。生成一个TermQuery对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName〞,〞queryWord〞)); 它的构造函数只接受一个参数,那就是一个Term对象。
IndexSearcher用来在建立好的索引上进行搜索的。它只能以只读的方式翻开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。
Hits 是用来保存搜索的结果的。
Lucene建立索引步骤
[1]指定索引源文件夹〔dataDir〕和索引的文件夹〔IndexDir〕;
[2]构造一个IndexWriter:IndexWriter构造器有三个参数,其中第一个参数可以是Lucene内建的类 Directory,也可以是File类型的文件夹路径,还可以是String类型的文件夹路径。第二个参数为语法分析器Analyzer,Lucene 自带了几个分析器的,但是对中文支持都不是很好。最后一个参数是要注意的,Lucene Api解释为“true to create the index or overwrite the existing one; false to append to the existing index〞,就是说在这里设定是否增量增加索引,在开发的时候得考虑了,设true将导致每次索引都删除原索引重建,但是如果原来不存在索引而设置为 false也将导致lucene抛出找不到指定文件的错误。
[3]构造Document,通过add方法参加字段:
代码
Document doc = new Document();
doc.add(Field.Text(〞contens〞,new FileReader(f)));
doc.add(Field.UnIndexed(〞filename〞,f.getCanonicalPath()));
其中Feild方法有很多种,可以去车东的文章查看详细。f为dataDir文件夹中的文本文件。
[4]IndexWriter通过addDocument(doc)参加document对象,此时lucene将启动分词器对Document对象进行分词索引;
[5]调用IndexWriter的optimize方法对索引进行优化,因为在索引过程中难免产生文件碎屑,该方法对文件进行优化可以提高检索效率;
[6]关闭IndexWriter:IndexWriter.close()。
Lucene进行搜索步骤
[1]创立IndexSearcher实例,其构造方法有三个,单参数,可以用String形式的索引文件夹路径;
[2]创立Query :代码
Query query = QueryParser.parse(q,〞contents〞,new Analyzer());
其中q为查询字符串,“contents〞为查询字段。
[3]搜索:代码
Hits hits = indexwriter.search(query)
hits由Document类型组成。可以通过hits.doc(i)获取具体的Document对象
Lucene2.0 Field类的结构
Document可以看作是数据库的一行记录。
Field可以看作是数据库的字段。
Field(String name, byte[] value, Field.Store store)
Field(String name, Reader reader)
Field(String name, Reader reader, Field.TermVector termVector)
Field(String name, String value, Field.Store store, Field.Index index)
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
在Field中有三个内部类:Field.Index,Field.Store,Field.termVector,而构造函数也用到了它们。
注意:termVector是Lucene 1.4新增的它提供一种向量机制来进行模糊查询的这个不常用,默认是false,不管是什么对于一般查询无影响。
它们的不同的组合,在全文检索中有着不同的作用。
方法
切词
索引
存储
用途
Field.Text(String name, String value)
Yes
Yes
Yes
切分词索引并存储,比方:标题,内容字段
Field.Text(String name, Reader value)
Yes
Yes
No
切分词索引不存储,比方:META信息,
不用于返回显示,但需要进行检索内容
Field.Keyword(String name, String value)
No
Yes
Yes
不切分索引并存储,比方:日期字段
Field.UnIndexed(String name, String value)
No
No
Yes
不索引,只存储,比方:文件路径
Field.UnStored(String name, String value)
Yes
Yes
No
只全文索引,不存