1.1 Lucene工作流程

2016-02-16 22:33:40 1,774 1

Lucene不是一个完整的应用,其只是提供了一套API,让我们可以往索引库中添加索引,并可以进行高效的查询。Lucene的查询主要应用在模糊查询上。下图演示了Lucene的工作流程:

11.png

在该图中,绿色加深的地方由Lucene完成,其他灰色部分用开发者完成。我们从下到上来介绍这张图。

创建索引过程

1、Raw Content-->Acquire Content

这个过程实际上是获取需要建立索引的原始内容。Lucene提供了一套API帮助我们对数据建立索引,但是数据的来源Lucene是不知道的。所以原始内容要由程序员来获取。原始数据的来源可以是用户在web控制台界面上添加的一条记录,例如我们通过博客网站来发表一篇博客;也可以是网络上的任何资源,例如百度爬虫会抓取互联网上数以千万计的网页内容来建立索引;也可以是本地文件。

2、Build Document

Lucene只能针对纯文本内容建立索引,意味着针对PDF、Word等格式的文档,我们必须提取出其文本内容。即使对于html和xml格式的数据,我们也要进行文本提取,因为html标签是不需要建立索引的,只有这些文件中的内容才是检索所需要的。

Build Document过程实际上是提取出我们建立索引的数据的必要的文本信息。

Document有很多字段Field,每个字段都有一个name和value。例如我们有一个文章Article实体,有title字段和content字段。我们对Article实体建立索引,我们希望用户在搜索的时候,不论是title还是content只要包含用户检索的内容,我们都可以返回这条记录。那么我们就要将Article实体转换成Lucene认识的Document对象。

要注意的是,Lucene是根据原始内容数据内容建立索引,但是我们需要先将原始数据内容转化为一个Document对象,然后才能进行索引。原因在于,java是面向对象的,要存储的数据类型有很多,而且可能还有很多用户自定义的数据类型。对于不同的数据类型,建立索引的要求是不同的,因此Lucene提供一个API Document,我们在建立索引之间将这些数据全部转为Document对象,Lucene就可以进行统一的管理,而不需要针对每一种数据类型都需要进行处理。

3、Analyze Document-->Index Document

当我们构建好Document之后,Lucene会对Document中的每个字段进行分词(Analyze)处理,实际上是一种倒叙索引。例如,我们创建的Article实体中content为:“中国的首都是北京....”,Lucene会将内容进行分词,那么这段话可能会被分为:"中国"、"首都"、"北京"等。Lucene建立索引实际上是对分词后的结果建立索引。而用户在搜索的时候,我们也会进行分词处理,如果用户搜索的是“北京以前叫燕京”,分词会包含"北京",因此这条记录也可以检索出来。

搜索过程:

在使用Lucene进行搜索的时候,搜索的关键字依然要由开发者提供给Lucene。搜索关键字的来源可以是用户在网页上输入的搜索内容。

在获取到用户的搜索关键字之后,我们会将搜索关键字构建成一个Query对象。原因是我们要对用户输入的搜索内容也进行分词,然后才在索引库中进行搜索。

最后我们可能要将搜索结果进行一些修饰(Render),例如高亮实现匹配上的关键字。

管理接口

所谓管理接口,是Lucene提供好了一套API让我们来管理索引库中的文件。通过Lucene提供的管理接口,我们可以优化Lucene的性能。不过Lucene本身并没有开发好一个完整的应用来让我们使用,只是提供了一套API。

分析接口

分析接口的作用,主要是让我们了解Lucene的索引库中的内容,以及统计命中率的一些操作。