开放源代码的全文检索引擎 Lucene
- 格式:doc
- 大小:208.50 KB
- 文档页数:39
lucene 基本概念Lucene 基本概念Lucene 是一个开源的全文搜索引擎库,被广泛地应用于高性能搜索和索引任务中。
它是 Apache 软件基金会的一个开源项目,并且被许多知名的商业产品使用。
本文将通过一步一步的方式,来介绍 Lucene 的基本概念和其原理。
一、Lucene 是什么?Lucene 是一个基于 Java 的全文搜索引擎库。
它提供了一系列的 API 和工具,用于创建、维护和搜索大规模文本数据集。
通过将文本数据索引到 Lucene 的索引库中,我们可以快速地进行全文搜索、排序和过滤等操作。
二、Lucene 的基本原理1. 倒排索引倒排索引是 Lucene 的核心概念之一。
它是一种数据结构,用于从词项到文档的映射。
通常,我们将文本数据分割成单词,然后对每个词项构建一个索引条目,该条目指向包含该词项的文档。
例如,假设我们有三个文档:文档1 包含 "Lucene 是一个搜索引擎库",文档2 包含 "Apache Lucene 是一个全文搜索库",文档3 包含 "Lucene 是基于 Java 的"。
在倒排索引中,我们将按照词项构建索引,如下所示:词项文档Lucene 1, 2, 3是 1, 2, 3一个 1, 2, 3搜索引擎库 1全文搜索库 2基于 3Java 3倒排索引的优势在于它能够快速地确定包含特定词项的文档,并且支持更复杂的查询表达式。
2. 分词器分词器是将原始文本分割成词项的模块。
Lucene 提供了多种分词器,如标准分词器、简单分词器等。
分词器还可以根据具体的需求进行定制。
分词器在构建索引和搜索时起到关键作用,它们确保在索引和搜索阶段都使用相同的分词规则。
3. 文档和字段在 Lucene 中,文档是一个最小的索引单位。
它由多个字段组成,每个字段包含一个词项或多个词项。
字段可以是文本、数值或日期等不同类型。
Lucene 中的文档和字段的设计灵活,可以根据实际需求进行定义和修改。
lucene原理Lucene是Apache软件基金会下的一个开放源代码的全文信息检索的开发工具包,它实现了完整的文档搜索引擎。
它提供两种索引类型:结构化索引和文档索引,两种索引类型都有它们各自的优势和缺点,取决于实际需要。
Lucene提供了一个组件化的架构,它利用一个高效的索引系统来实现搜索。
此外,Lucene还提供了许多的文本处理功能,如词法分析,摘要,跟踪搜索日志,等等。
而且,Lucene和其他全文搜索系统不同,它允许用户定制自己的索引和结构,从而满足特定的搜索需求。
Lucene的核心是索引机制,它可以对一系列文档进行检索、搜索、高级搜索。
它利用微机二进制索引结构可以快速访问准确的结果,还可以在全文检索时进行模糊处理,识别文档中的同义词等。
Lucene还跟踪文档更新,可以检测何时需要重组全文索引,从而实现快速响应搜索需要。
除此之外,Lucene还可以搜索特定的文档,文本,页面,网页或者指定的网站。
Lucene的设计出发点是提供全文搜索的性能,而不仅仅是提供精确的搜索词语。
这意味着Lucene可以提供精确的搜索,使用的是数据结构和算法来实现搜索,搜索的结果可以按照权重排序,并且可以对搜索结果进行筛选,从而更好地满足搜索用户的需求。
Lucene通过提供文档过滤器和搜索过滤器,可以用来限定搜索结果的范围。
此外,Lucene 还提供了一系列的分析器,来处理原始的文档,包括不同类型的文件,如Word文档,PDF文档,HTML文档等等。
基于Lucene的搜索服务可以满足各种不同的搜索需求。
用户可以根据自己的关键字设置搜索条件,也可以应用不同类型的条件,如限制搜索结果的数量,搜索结果的排序等。
Lucene利用高效的计算方法和索引技术,能够提供快速准确的搜索结果,并对不同类型的数据进行处理,进一步提高搜索效率。
Grafana是一个开源的数据可视化工具,可以帮助用户更直观地查看和理解数据。
而Lucene是一个基于Java的全文搜索引擎库,用于实现全文搜索。
在Grafana中,使用Lucene语法可以帮助用户进行更精确和高效的数据查询和过滤。
本文将介绍Grafana中Lucene语法的基本规则和常用语法,帮助用户更好地利用Lucene语法进行数据查询和分析。
一、Lucene语法的基本规则1. 字段查询在Lucene中,可以使用字段查询来指定搜索的字段,例如"title:Grafana"表示在标题字段中搜索包含Grafana的数据。
2. 通配符查询Lucene支持通配符查询,可以使用*代表0或多个任意字符,使用?代表一个任意字符。
3. 逻辑运算可以使用逻辑运算符AND、OR、NOT来组合多个查询条件,例如"title:Grafana AND author:Lucene"表示同时满足标题包含Grafana 并且作者是Lucene的数据。
4. 范围查询使用[]表示闭区间,{}表示开区间,例如"date:[xxx TO xxx}"表示在2019年内的数据。
5. 模糊查询可以使用~后接一个整数来表示模糊查询的最大编辑距离,例如"Graf~"表示匹配Graf、Graff等单词。
6. 短语查询使用双引号来表示短语查询,例如""Grafana Lucene""表示搜索包含Grafana和Lucene相连的短语。
二、Grafana中Lucene语法的常用语法1. 查询表达式在Grafana的查询表达式中,可以使用Lucene语法来指定查询条件,例如"title:Grafana AND author:Lucene"。
2. 聚合查询可以使用Lucene语法来进行聚合查询,例如"status:200"表示查询状态码为200的数据。
基于Lucene全文检索系统的研究与实现[摘要] lucene是一个开放源代码的全文检索引擎工具包,利用它可以快速地开发一个全文检索系统。
利用lucene开发了一个全文检索系统,通过其特殊的索引结构,实现了传统数据库不擅长的全文索引机制,提供了对非结构化信息的检索能力。
[关键词] lucene 信息检索全文检索索引一、引言计算机技术及网络技术的迅速发展,使得internet成为人类有史以来资源最多、品种最全、规模最大的信息资源库。
如何在这海量的信息里面快速、全面、准确地查找所需要的资料信息已经成了人们关注的焦点,也成了研究领域内的一个热门课题。
这些信息基本上可以分做两类:结构化数据和非结构化数据(如文本文档、word 文档、pdf文档、html文档等)。
现有的数据库检索,是以结构化数据为检索的主要目标,实现相对简单。
但对于非结构化数据,即全文数据,由于复杂的数据事务操作以及低效的高层接口,导致检索效率低下。
随着人们对信息检索的要求也越来越高,而全文检索因为检索速度快、准确性高而日益受到广大用户的欢迎, lucene是一个用java写的全文检索引擎工具包,可以方便地嵌入到各种应用中实现针对应用的全文索引和检索功能。
这个开源项目的推出及发展,为任何应用提供了对非结构化信息的检索能力。
二、全文检索策略通常比较厚的书籍后面常常附关键词索引表(比如,北京:12,34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。
而数据库索引能够大大提高查询的速度原理也是一样,由于数据库索引不是为全文索引设计的,因此,使用like “%keyword%”时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,like对性能的危害是极大的。
如果是需要对多个关键词进行模糊匹配:like“%keyword1%”and like “%keyword2%”……其效率也就可想而知了。
一、lucene模糊匹配原理概述lucene是一个开源的全文检索引擎工具,提供了强大的文本搜索和分析功能。
在实际应用中,经常需要进行模糊匹配,以处理用户输入的错别字、拼写错误或者同义词。
模糊匹配是lucene中非常重要的功能,它可以帮助用户找到相关的文档,提高搜索的准确性和全面性。
二、lucene模糊匹配的算法原理1. Levenshtein Distance算法Levenshtein Distance是衡量两个字符串相似程度的一种算法,也称为编辑距离。
在lucene中,模糊匹配主要使用Levenshtein Distance算法来实现。
该算法通过计算两个字符串之间的距离,从而确定它们的相似程度。
具体来说,它通过插入、删除和替换操作,将一个字符串转换成另一个字符串所需的最小步骤数来衡量相似度。
2. 模糊查询的实现方式在lucene中,模糊查询可以通过FuzzyQuery类来实现。
利用FuzzyQuery,可以指定一个最大编辑距离,从而允许匹配到具有一定相似度的文档。
FuzzyQuery会基于Levenshtein Distance算法来进行模糊匹配,找到编辑距离小于等于指定值的文档。
三、模糊匹配的应用场景1. 处理用户输入错误当用户在搜索框中输入错别字或者拼写错误时,模糊匹配可以帮助系统找到相关的文档,并提供纠正建议,提高搜索的准确性和用户体验。
2. 同义词匹配在自然语言处理中,同一个概念可能有多种不同的表达方式。
通过模糊匹配,可以将具有相似含义的词语进行匹配,从而提高搜索的全面性。
3. 解决词形变化问题词形变化是自然语言中常见的现象,同一个词可能有不同的变形形式。
通过模糊匹配,可以将不同词形的单词对应起来,使得搜索更加全面和准确。
四、模糊匹配的优化策略1. 设置合适的编辑距离阈值在使用模糊匹配时,需要根据具体的应用场景来设置合适的编辑距离阈值。
如果编辑距离过小,可能会产生大量的不必要匹配;如果编辑距离过大,可能会包含过多的无关文档。
antlr4 lucene 语法解析ANTLR (ANother Tool for Language Recognition) 是一个强大的语法分析器生成器,它可以用来解析各种语言的语法。
它广泛用于构建编译器、解释器、数据提取工具等。
Lucene 是一个高性能的开源全文搜索引擎,它提供了全文搜索和信息检索的功能。
将 ANTLR 和 Lucene 结合使用,可以创建一个强大的文本解析和搜索工具。
下面是一个简单的示例,展示如何使用 ANTLR4 和 Lucene 来解析和搜索文本。
1. 创建 ANTLR 语法文件首先,你需要创建一个 ANTLR 语法文件来定义你要解析的文本的语法。
例如,你可以创建一个简单的语法文件来解析英文句子。
```antlrgrammar Sentence;sentence : word (space word);word : [a-zA-Z]+;space : ' ';```这个语法文件定义了一个 `sentence` 规则,它是由一个或多个 `word` 组成的,其中 `word` 是由一个或多个字母组成的序列。
`space` 规则表示一个空格字符。
2. 生成 ANTLR 解析器使用 ANTLR 工具生成 Java 代码。
你需要安装 ANTLR 工具并运行以下命令:```bashantlr4 -o output_directory -package```这将生成一个名为 `SentenceLexer` 和 `SentenceParser` 的 Java 类。
3. 使用 Lucene 进行搜索现在,你可以使用 Lucene 来索引和搜索解析后的文本。
首先,你需要创建一个 `IndexWriter` 来索引文本:```javaimport ;import ;import ;import ;import ;...RAMDirectory directory = new RAMDirectory(); IndexWriterConfig config = new IndexWriterConfig(_4_10_4, new StandardAnalyzer());IndexWriter writer = new IndexWriter(directory, config);... // 索引文本到 writer 中();```然后,你可以使用 `IndexSearcher` 和 `QueryParser` 来搜索文本:```javaimport ;import ;import ;import ;import ;import ;import ;import ;import ;import ;... // 加载已索引的目录到 IndexSearcher 中QueryParser parser = new QueryParser(_4_10_4, "sentence", new StandardAnalyzer());Query query = ("your search query"); // 例如 "hello world" TopDocs results = (query, 10, new Sort(new SortField("sentence", ))); ... // 处理搜索结果```这是一个简单的示例,展示了如何使用 ANTLR 和 Lucene 来解析和搜索文本。
javalucene用法JavaLucene是一个用于全文检索的开源库,它提供了一个高效且可扩展的搜索引擎。
它基于Apache Lucene项目,并提供了Java编程语言的接口和实现。
使用JavaLucene,我们可以创建索引并搜索包括文本、数字、日期等数据类型的文档。
下面是一些常见的JavaLucene用法:1.创建索引:首先,我们需要创建一个用于存储索引的目录。
然后,我们可以使用IndexWriter类将文档添加到索引中。
每个文档包含一个或多个字段,我们可以指定字段的类型和分析方式。
分析器负责将文本分成单词,并对它们进行规范化和标准化,以便更好地进行搜索。
2.搜索:我们使用IndexSearcher类来执行搜索操作。
可以使用QueryParser类解析查询字符串,并将其转换为查询对象。
查询可以是简单的词语匹配、范围查询、模糊查询等。
搜索结果以文档的形式返回,我们可以根据需要对其进行排序、过滤等操作。
3.更新索引:如果需要对索引进行更新,例如添加新的文档或删除现有的文档,我们可以使用IndexWriter类来执行这些操作。
之后,我们需要使用IndexReader类来重新打开索引以获取最新的结果。
拓展:除了基本的索引和搜索功能,JavaLucene还提供了其他一些强大的功能:1.高级搜索:JavaLucene支持布尔搜索、通配符搜索、模糊搜索、模糊匹配、短语搜索等。
这些功能可以帮助我们更准确地定位所需的结果。
2.高亮显示:JavaLucene可以通过标记匹配结果中的关键词并进行高亮显示来改善用户体验。
这对于搜索结果的展示非常有帮助。
3.分布式搜索:JavaLucene可以与其他工具配合使用,如Apache Solr和Elasticsearch,进行分布式搜索。
这允许我们搭建具有高可用性和可扩展性的搜索引擎。
4.自定义扩展:JavaLucene允许用户通过实现自定义的分析器、查询解析器、评分算法等来扩展其功能。
搜索引擎Lucene第一章Lucene简介Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码[的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
第二章lucene索引的建立的五个基础类索引的建立,Lucene 提供了五个基础类,分别是Document, Field, IndexWriter, Analyzer, Directory。
以下是他们的用途:DocumentDocument的含义为文档,在Lucene中,它代表一种逻辑文件。
Lucene本身无法对物理文件建立索引,而只能识别并处理Document的类型文件。
Lucene从Document取出相关的数据源并根据属性配置进行相应的处理。
Field对象是用来描述一个文档的某个属性的lucene中的field也具有一些特定的类型如在中,Field内部包含两个静态的内部类分别是Store和Index详细的描述了Field的属性,它们分别表示Field的储存方式和索引方式。
Store类有3个公有的静态属性::表示该Field不需要储存。
:表示该Field需要储存。
:表示使用压缩方式来保存这个Field的值。
Index有4个公有的静态属性::表示该Field不需要索引,也就是用户不需要去查找该Field的值。
:表示该Field先被分词再被索引。
TOKENIZED:表示不对该Field进行分词,但是要对他进行索引,也就是该Field会被用户查找。
:表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。
Analyzer在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer 来做的。
luence查询语法Luence是一个基于Lucene的开源搜索引擎,用于构建全文搜索和文档检索应用程序。
以下是Luence查询语法的一些常见用法:1. 简单查询:- `term`: 匹配指定词项。
例如:`lucene`。
- `field:term`: 在指定字段中匹配词项。
例如:`title:lucene`。
2. 逻辑运算符:- `AND`: 匹配同时包含两个或多个词项的文档。
例如:`lucene AND search`。
- `OR`: 匹配包含任意一个词项的文档。
例如:`lucene OR search`。
- `NOT`: 排除包含指定词项的文档。
例如:`lucene NOT search`。
3. 通配符:- `*`: 匹配0个或多个字符。
例如:`luc*ne`匹配`lucene`和`lucine`。
- `?`: 匹配一个字符。
例如:`lu?ene`匹配`lucene`和`lucene`。
4. 模糊搜索:- `~`: 在单词后加上`~`可以进行模糊搜索,匹配与指定词项类似的词项。
例如:`lucen~`匹配`lucene`、`luciny`等。
5. 短语搜索:- `"phrase search"`: 使用双引号来匹配包含完整短语的文档。
6. 范围搜索:- `field:[value1 TO value2]`: 匹配范围内的值。
例如:`price:[10 TO 100]`匹配价格在10到100之间的文档。
7. 分组查询:- `(query1) AND (query2)`: 使用括号来分组查询。
例如:`(lucene AND search) OR (java AND development)`。
以上是Luence查询语法的一些常见用法,可以根据具体需求进行组合和拓展。
开放源代码的全文检索引擎Lucene――介绍、系统结构与源码实现分析第一节全文检索系统与Lucene简介一、什么是全文检索与全文检索系统?全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
这个过程类似于通过字典中的检索字表查字的过程。
全文检索的方法主要分为按字检索和按词检索两种。
按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。
对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。
按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。
英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。
中文等文字则需要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点,在此不做详述。
全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。
一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向WWW[1]的开发接口、二次应用开发接口等等。
功能上,全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能,外围则由各种不同应用具有的功能组成。
结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等,加上各种外围应用系统等等共同构成了全文检索系统。
图1.1展示了上述全文检索系统的结构与功能。
在上图中,我们看到:全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。
一个全文检索应用的优异程度,根本上由全文检索引擎来决定。
因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。
另一个方面,一个优异的全文检索引擎,在做到效率优化的同时,还需要具有开放的体系结构,以方便程序员对整个系统进行优化改造,或者是添加原有系统没有的功能。
比如在当今多语言处理的环境下,有时需要给全文检索系统添加处理某种语言或者文本格式的功能,比如在英文系统中添加中文处理功能,在纯文本系统中添加XML[2]或者HTML[3]格式的文本处理功能,系统的开放性和扩充性就十分的重要。
二、什么是Lucene?Lucene是apache软件基金会[4] jakarta项目组的一个子项目,是一个开放源代码[5]的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Lucene的原作者是Doug Cutting,他是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎[6]的主要开发者,后在Excite[7]担任高级系统架构设计师,目前从事于一些Internet底层架构的研究。
早先发布在作者自己的.lucene./,后来发布在SourceForge[8],2001年年底成为apache软件基金会jakarta的一个子项目:/lucene/。
三、Lucene的应用、特点及优势作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其部全文检索子系统的核心。
apache软件基金会的使用了Lucene作为全文检索的引擎,IBM的开源软件eclipse[9]的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere[10]中也采用了Lucene。
Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。
Lucene作为一个全文检索引擎,其具有如下突出的优点:(1)索引文件格式独立于应用平台。
Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。
然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Luc ene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。
首先,它的开发源代码发行方式(遵守Apache Software License[12]),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。
在这一点上,商业软件的灵活性远远不及Lucene。
其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、P DF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。
最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
四、本文的重点问题与cLucene项目作为中国人民大学信息学院99级本科生的一个毕业设计项目,我们对Lucene进行了深入的研究,包括系统的结构,索引文件结构,各个部分的实现等等。
并且我们启动了cLucene项目,做为一个Lucene的C++语言的重新实现,以期望带来更快的速度和更加广泛的应用围。
我们先分析了系统结构,文件结构,然后在研究各个部分的具体实现的同时开始进行的cLucene实现。
限于时间的限制,到本文完成为止,cLucen e项目并没有完成,对于Lucene的具体实现部分也仅仅完成到了索引引擎部分。
接下来的部分,本文将对Lucene的系统结构、文件结构、索引引擎部分做一个彻底的分析。
以期望提供对Lucene全文检索引擎的系统架构和部分程序实现的清晰的了解。
cLucene项目则作为一个开放源代码的项目,继续进行的开发。
有关cLucene项目的一些信息:n 开发语言:ISO C++[15],STLport 4.5.3[16],OpenTop 1.1[17]n 目标平台:Win32,POSIXn 授权协议:GNU General Public License (GPL)[18]第二节Lucene系统结构分析一、系统结构组织Lucene作为一个优秀的全文检索引擎,其系统结构具有强烈的面向对象特征。
首先是定义了一个与平台无关的索引文件格式,其次通过抽象将系统的核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式的处理,最终达成了一个低耦合高效率,容易二次开发的检索引擎系统。
以下将讨论Lucene系统的结构组织,并给出系统结构与源码组织图:从图中我们清楚的看到,Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。
其中直接操作索引文件的索引核心又是系统的重点。
Lucene的将所有源码分为了7个模块(在java语言中以包即package来表示),各个模块所属的系统部分也如上图所示。
需要说明的是org.apache.lucene.qu eryPaser是做为org.apache.lucene.search的语法解析器存在,不被系统之外实际调用,因此这里没有当作对外接口看待,而是将之独立出来。
从面象对象的观点来考察,Lucene应用了最基本的一条程序设计准则:引入额外的抽象层以降低耦合性。
首先,引入对索引文件的操作org.apache.lucene.store的封装,然后将索引部分的实现建立在(org.apache.lucene.index)其之上,完成对索引核心的抽象。
在索引核心的基础上开始设计对外的接口org.apache.lucene.search与org.apache.lucene.analysis。
在每一个局部细节上,比如某些常用的数据结构与算法上,Lucene也充分的应用了这一条准则。
在高度的面向对象理论的支撑下,使得Lucene的实现容易理解,易于扩展。
Lucene在系统结构上的另一个特点表现为其引入了传统的客户端服务器结构以外的的应用结构。
Lucene可以作为一个运行库被包含进入应用本身中去,而不是做为一个单独的索引服务器存在。
这自然和Lucene开放源代码的特征分不开,但是也体现了Lucene在编写上的本来意图:提供一个全文索引引擎的架构,而不是实现。
[B][/B]二、数据流分析理解Lucene系统结构的另一个方式是去探讨其中数据流的走向,并以此摸清楚Lucene系统部的调用时序。
在此基础上,我们能够更加深入的理解Lucene的系统结构组织,以方便以后在Lucene系统上的开发工作。
这部分的分析,是深入Lucene系统的钥匙,也是进行重写的基础。
我们来看看在Lucene系统中的主要的数据流以及它们之间的关系图:索引查找逻辑索引构建逻辑查询语句语法分析逻辑词法分析逻辑存储抽象图2.2很好的表明了Lucene在部的数据流组织情况,并且沿着数据流的方向我们也可以对与Luc ene部的执行时序有一个清楚的了解。
现在将图中的涉及到的流的类型与各个逻辑对应系统的相关部分的关系说明一下。