scene 项目分析报告
Lucene 项目分析报告
目录 简介 功能模块 21文档( Document)模块 211功能 212使用方法 213设计思路 22索引(ndex)模块 221功能 22使用方法 223设计思路 23查询( Search)模块 功能. 232使用方法 233设计思路 24语汇分析( Analysis模块 241功能 242使用方法… 243设计思路 25存储( store)模块… 1功能 252使用方法 253设计思路 3综合应用 4总结
目录 1 简介...........................................................................................................................................3 2 功能模块...................................................................................................................................3 2.1 文档(Document)模块 ...................................................................................................4 2.1.1 功能...................................................................................................................4 2.1.2 使用方法...........................................................................................................4 2.1.3 设计思路...........................................................................................................5 2.2 索引(Index)模块 ...........................................................................................................6 2.2.1 功能...................................................................................................................7 2.2.2 使用方法...........................................................................................................7 2.2.3 设计思路...........................................................................................................9 2.3 查询(Search)模块 .........................................................................................................9 2.3.1 功能...................................................................................................................9 2.3.2 使用方法.........................................................................................................10 2.3.3 设计思路.........................................................................................................10 2.4 语汇分析(Analysis)模块 .............................................................................................11 2.4.1 功能.................................................................................................................11 2.4.2 使用方法.........................................................................................................12 2.4.3 设计思路.........................................................................................................12 2.5 存储(store)模块..........................................................................................................13 2.5.1 功能.................................................................................................................13 2.5.2 使用方法.........................................................................................................13 2.5.3 设计思路.........................................................................................................14 3 综合应用.................................................................................................................................15 4 总结.........................................................................................................................................15
1简介 在介绍 Lucene之前,首先,要介绍一下全文检索这个重要的概念,那么什么是全文检 索呢? 全文检索,就是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索 引,指明该词在文章中出现的次数和位置,当用户査询时,检索程序就根据事先建立的索引 进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表 查字的过程 其次, Lucene是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检 索引擎,而是一个全文检索引擎的架构,提供了完整的査询引擎和索引引擎,部分文本分析 引擎(英文与德文两种西方语言)。 Lucene的目的是为软件开发人员提供一个简单易用的工 具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检 索引擎。 Lucene属于 apache软件基金会 jakarta项目组的一个子项目。 2功能模块 经过一个学期对 Lucene项目的功能及源码的研究,本项目小组发现再 Lucene中的核心 类库应该包括以下几个方面: Document、ndex、 Search、 Analyzer、 Store,如下表所示: 核心包名称 解释 Document类是 Lucene中的文件最小单元,与文件系统中存在的每个 文件有一一对应的关系,通过 Lucene内部定义的Feld(域)概念 将一个文件中划分为多个部分,分别提取出每一块的关键内容进行索 引记录。 Index ndex包将所有需要搜索的数据源进行再加工,形成了适于 Lucene的 搜索操作的文件结构,去除了一些不可能作为搜索关键的词语,减少 了信息检索量,从而提高了信息检索的效率,通过不断的增减索引内 容,达到与原始数据源同步的目的 Search Search功能的实现是基于索引文件的建立,通过对索引文件的检索达 到真正搜索的目的, Lucene项目内部为搜索操作提供了多种实现方 法,包括:项搜索、范围搜索、字符串前缀搜索、短语搜索、组合搜 索、通配符搜索、类似项搜索等。 Analyzer Analyzer功能是在索引和搜索两本分的基础上产生的,是为了辅助索 引创建和搜索过程而产生的,在整个 Lucene项目中,语汇分析这个 模块最能体现出其关于搜索的特性。 Store Store的功能也在于加强 Lucene的搜索效率,但是与 Analyzer不同的 是,它重点在研究如何利用计算机的内存容量和文件系统的存储空间 来提高搜索效率,具体的方法包括:缓存查找结果、在内存中创建索 引等 本文档将按照这五个功能的先后顺序对 Lucene的开源项目进行详细阐述,并且在其中 增加项目小组成员对不同模块的分析内容,对项目中已有的设计模式的思想进行抽象和概括
1 简介 在介绍 Lucene 之前,首先,要介绍一下全文检索这个重要的概念,那么什么是全文检 索呢? 全文检索,就是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索 引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引 进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表 查字的过程。 其次,Lucene 是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检 索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析 引擎(英文与德文两种西方语言)。Lucene 的目的是为软件开发人员提供一个简单易用的工 具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检 索引擎。Lucene 属于 apache 软件基金会 jakarta 项目组的一个子项目。 2 功能模块 经过一个学期对 Lucene 项目的功能及源码的研究,本项目小组发现再 Lucene 中的核心 类库应该包括以下几个方面:Document、Index、Search、Analyzer、Store,如下表所示: 核心包名称 解释 Document Document 类是 Lucene 中的文件最小单元,与文件系统中存在的每个 文件有一一对应的关系,通过 Lucene 内部定义的 Field(域)概念, 将一个文件中划分为多个部分,分别提取出每一块的关键内容进行索 引记录。 Index Index 包将所有需要搜索的数据源进行再加工,形成了适于 Lucene 的 搜索操作的文件结构,去除了一些不可能作为搜索关键的词语,减少 了信息检索量,从而提高了信息检索的效率,通过不断的增减索引内 容,达到与原始数据源同步的目的。 Search Search 功能的实现是基于索引文件的建立,通过对索引文件的检索达 到真正搜索的目的,Lucene 项目内部为搜索操作提供了多种实现方 法,包括:项搜索、范围搜索、字符串前缀搜索、短语搜索、组合搜 索、通配符搜索、类似项搜索等。 Analyzer Analyzer 功能是在索引和搜索两本分的基础上产生的,是为了辅助索 引创建和搜索过程而产生的,在整个 Lucene 项目中,语汇分析这个 模块最能体现出其关于搜索的特性。 Store Store 的功能也在于加强 Lucene 的搜索效率,但是与 Analyzer 不同的 是,它重点在研究如何利用计算机的内存容量和文件系统的存储空间 来提高搜索效率,具体的方法包括:缓存查找结果、在内存中创建索 引等。 本文档将按照这五个功能的先后顺序对 Lucene 的开源项目进行详细阐述,并且在其中 增加项目小组成员对不同模块的分析内容,对项目中已有的设计模式的思想进行抽象和概括
21文档[ Document模块 在 Lucene重, Document是承载数据的实体,包含一些域(Fied)的集合相当于一个虚 拟的文档,比如:一个web页面、一个Ema消息或者一个文本文件等,从中可以提取出大 量的数据。一个文档的域代表文档或者和文档相关的一些源数据。文档数据的数据源对于 Lucene来说是无关紧要的,像作者、标题、主题、修改日期等元数据都作为文档的不同的 域被单独存储并索引。 Document对象中有一个更小的概念,是 Lucene为了更加有效的分析文档内容而提出 的一域( Field),每一个域都对应一段数据,这些数据都是在搜索过程中可能会被查询或者 在索引中被检索的,域的分类主要有一下四种 域类型 解释 Keyword域 不需要被分析,会逐字地被索引并存储,适用于需要被全部保留的域 如:URL、文件系统路径、日期、个人姓名等 UnIndex域 不需要被分析和索引,但是会被存储在索引文件中,适用于需要和搜索 结果一起被显示出来的而不会被用户直接搜索的数据,如URL或者数据 库的主键等 UnStored域 需要被分析和索引,但是不会被存储到索引文件中,适用于不需要原始 形式的大量的数目索引文本,例如:网页的正文等 Text域 需要被分析和索引,能够被搜索。 211功能 由于 Document是 Lucene中承载数据的实体这个特性,那么同事也决定了它的功能是 抽取数据源中的有用的数据,以域的形式保存在数据实体中,然后再将其添加到索引中去。 从这个角度来看, Document的功能范围直接影响到 Lucene可以进行操作的数据源的范围 因为 Document本身只能对 java. lang String和 java. io. Reader两种对象进行处理,所以 Lucene 只能处理文本,那么对非文本文件的处理工作需要利用相关工具进行二次处理,转化为文本 文件,才能进行操作 212使用方法 在实际的使用过程中,通常都需要对 Lucene中的 Document类进行重写,以满足在效 率和作用范围的要求。在本项目小组研究研究过程中用到的编写的程序中,建立了自己的 File Document类,对 Lucene自带的 Document操作进行封装,创建了关于这个文件的三个域, 分别为:path(文件路径)、 modified(修改时间)、 contents(文件内容),从而把搜索信息 和结果限制在这三方面的内容中。具体信息请参考如下代码片段:
2.1 文档(Document)模块 在 Lucene 重,Document 是承载数据的实体,包含一些域(Field)的集合相当于一个虚 拟的文档,比如:一个 web 页面、一个 Email 消息或者一个文本文件等,从中可以提取出大 量的数据。一个文档的域代表文档或者和文档相关的一些源数据。文档数据的数据源对于 Lucene 来说是无关紧要的,像作者、标题、主题、修改日期等元数据都作为文档的不同的 域被单独存储并索引。 Document 对象中有一个更小的概念,是 Lucene 为了更加有效的分析文档内容而提出 的―域(Field),每一个域都对应一段数据,这些数据都是在搜索过程中可能会被查询或者 在索引中被检索的,域的分类主要有一下四种: 域类型 解释 Keyword 域 不需要被分析,会逐字地被索引并存储,适用于需要被全部保留的域, 如:URL、文件系统路径、日期、个人姓名等。 UnIndex 域 不需要被分析和索引,但是会被存储在索引文件中,适用于需要和搜索 结果一起被显示出来的而不会被用户直接搜索的数据,如 URL 或者数据 库的主键等。 UnStored 域 需要被分析和索引,但是不会被存储到索引文件中,适用于不需要原始 形式的大量的数目索引文本,例如:网页的正文等。 Text 域 需要被分析和索引,能够被搜索。 2.1.1 功能 由于 Document 是 Lucene 中承载数据的实体这个特性,那么同事也决定了它的功能是 抽取数据源中的有用的数据,以域的形式保存在数据实体中,然后再将其添加到索引中去。 从这个角度来看,Document 的功能范围直接影响到 Lucene 可以进行操作的数据源的范围, 因为 Document 本身只能对 java.lang.String 和 java.io.Reader 两种对象进行处理,所以 Lucene 只能处理文本,那么对非文本文件的处理工作需要利用相关工具进行二次处理,转化为文本 文件,才能进行操作。 2.1.2 使用方法 在实际的使用过程中,通常都需要对 Lucene 中的 Document 类进行重写,以满足在效 率和作用范围的要求。在本项目小组研究研究过程中用到的编写的程序中,建立了自己的 FileDocument类,对Lucene自带的Document操作进行封装,创建了关于这个文件的三个域, 分别为:path(文件路径)、modified(修改时间)、contents(文件内容),从而把搜索信息 和结果限制在这三方面的内容中。具体信息请参考如下代码片段:
// make a new, empty document Document doc new Document (i / Add the path of the file as a field named "path". Use a field that is indexed (i.e. searchable), but don't tokenize the field into WOras doc. add (new Field("path",f getPath(), Field. store. YES, Field Index. UN TOKENIZED)) / Add the last modified date of the file a field named "modified" Use, a field that is indexed (i.e. searchable), but don't tokenize the field doc. add (new Field("modified", DateTools. time Tostring(f. lastModified(), DateTools Resolution MINUTE) Field. store. YES, Field. Index. UN TOKENIZED))i / Add the contents of the file to a field named "contents f a Reader, so that the text of the file is tokenized and indexed, but not stored. Note that FileReader expects the file to be in the system's default encoding. If that 's not the case searching for special characters will fail doc. add (new Field(" contents", new FileReader(f))) / return the document return doci 213设计思路 从 Document的使用方法中,看出它唯一的操作就是将 Field嵌入其中,并且为不同的 Field 命名和设定类型,所以从这个角度考虑,在 Document内部存在一个储存 Field的链表,对 每次加入的Fed进行记录,UML类图如下
// make a new, empty document Document doc = new Document(); // Add the path of the file as a field named "path". Use a field that is indexed (i.e. searchable), but don't tokenize the field into words. doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED)); // Add the last modified date of the file a field named "modified". Use, a field that is indexed (i.e. searchable), but don't tokenize the field into words. doc.add(new Field("modified", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.UN_TOKENIZED)); // Add the contents of the file to a field named "contents". Specify a Reader, so that the text of the file is tokenized and indexed, but not stored. Note that FileReader expects the file to be in the system's default encoding. If that's not the case searching for special characters will fail. doc.add(new Field("contents", new FileReader(f))); // return the document return doc; 2.1.3 设计思路 从 Document 的使用方法中,看出它唯一的操作就是将 Field 嵌入其中,并且为不同的 Field 命名和设定类型,所以从这个角度考虑,在 Document 内部存在一个储存 Field 的链表,对 每次加入的 Field 进行记录,UML 类图如下: