2.1 Lucene概述

2.1.1 Lucene简介

Lucene是一个开源的全文检索引擎工具包,最初由Doug Cutting开发。早在1997年,资深全文检索专家Doug Cutting用一个周末的时间,使用Java语言创作了一个文本搜索的开源函数库,目的是为各种中小型应用软件加入全文检索功能。不久之后,Lucene诞生了,2000年Lucene成为Apache开源社区的一个子项目。随着Lucene被人们熟知,越来越多的用户和研发人员加入其中,完善并壮大项目的发展,Lucene已成为最受欢迎的具有完整的查询引擎和索引引擎的全文检索库。

2.1.2 Lucene特点

Lucene从问世之后,引发了开源社区的巨大反响,程序员们不仅使用它构建全文检索应用,而且将之集成到各种系统软件中去,除此之外还用来构建Web应用。维基百科用Lucene建立了一个站内的强大搜索功能,用以检索站内数以千万的词条。IBM的商业软件Web Sphere也采用了Lucene作为全文索引引擎。Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。Lucene的优点主要有以下3点:

1.稳定,索引性能高

● 现代硬盘上每小时能够索引150GB以上的数据。

● 对内存的要求小——只需要1MB的堆内存。

● 增量索引和批量索引一样快。

● 索引的大小约为索引文本大小的20%~30%。

2.高效、准确、高性能的搜索算法

● 搜索排名——最好的结果显示在最前面。

● 许多强大的查询类型:短语查询、通配符查询、近似查询、范围查询等。

● 对字段级别搜索(如标题,作者,内容)。

● 可以对任意字段排序。

● 支持搜索多个索引并合并搜索结果。

● 支持更新操作和查询操作同时进行。

● 灵活的切面、高亮、join和group by功能。

● 速度快,内存效率高,容错性好。

● 可选排序模型,包括向量空间模型和BM25模型。

● 可配置存储引擎。

3.跨平台解决方案

● 作为Apache开源许可,在商业软件和开放程序中都可以使用Lucene。

● 100%纯Java编写。

● 对多种语言提供接口。

2.1.3 Lucene架构

先从整体上看一下Lucene的架构设计。图2-1是Lucene的整体架构图,是对Lucene精髓的概括,理解了这张图就从整体上把握住了Lucene。

图2-1 Lucene架构图

先看上层应用,首先是信息采集的过程,文件系统、数据库、万维网以及手工输入的文件都可以作为信息采集的对象,也是要搜索的文档的来源,采集万维网上的信息一般使用网络爬虫。完成信息采集之后到Lucene层面主要有两大任务:索引文档和搜索文档,索引文档的过程完成由原始文档到倒排索引的构建过程,搜索文档用以处理用户查询。应用层的第三部分就是用户接口,用户输入查询关键词,Lucene完成文档搜索任务,经过分词、匹配、评分、排序等一系列过程之后返回用户想要的文档。

一次完整的搜索从用户输入要查询的关键词开始,比如想查找Lucene的相关学习资料,我们都会在Google或百度等搜索引擎中输入关键词,比如输入“Lucene,全文检索框架”,之后系统根据用户输入的关键词返回相关信息。一次检索大致可分为4步:

第一步:查询分析

正常情况下用户输入正确的查询,比如搜索“里约奥运会”这个关键词,用户输入正确完成一次搜索,但是搜索需求通常都是全开放的,任何的用户需求都是有可能的,很大一部分还是非常口语化和个性化的,有时候还会存在拼写错误,如图2-2所示,用户不小心把“淘宝”打成“涛宝”,这时候需要用自然语言处理技术来做拼写纠错等处理,以正确理解用户需求。

图2-2 搜索引擎拼写纠正

第二步:分词技术

这一步利用自然语言处理技术将用户输入的查询语句进行分词,如标准分词会把“lucene,全文检索框架”分成:lucene|全|文|检|索|框|架|,空格分词会分成:lucene,|全文检索框架|,二分法会分成:lucene|全文|文检|检索|索框|框架|,还有简单分词等多种分词方法。

第三步:关键词检索

提交关键词后在倒排索引库中进行匹配,倒排索引就是关键词和文档之间的对应关系,就像给文档贴上标签。比如在文档集中含有lucene关键词的有文档1、文档6、文档9,含有全文检索的有文档1、文档6,那么做与运算,同时含有lucene和全文检索的文档就是1和6,在实际的搜索中会有更复杂的文档匹配模型。

第四步:搜索排序

对多个相关文档进行相关度计算、排序,返回给用户检索结果。