日期:2014-05-16  浏览次数:20962 次

使用 Apache Lucene 搜索文本
本文将探讨 Apache Lucene —— 性能卓越、功能全面的文本搜索引擎库。我们将学习 Lucene 架构及其核心 API。学习如何使用 Lucene 进行跨平台全文本搜索、建立索引、显示结果,以及如何扩展搜索。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

简介

Lucene 是一个开源、高度可扩展的搜索引擎库,可以从 Apache Software Foundation 获取。您可以将 Lucene 用于商业和开源应用程序。Lucene 强大的 API 主要关注文本索引和搜索。它可以用于为各种应用程序构建搜索功能,比如电子邮件客户端、邮件列表、Web 搜索、数据库搜索等等。Wikipedia、TheServerSide、jGuru 和 LinkedIn 等网站都使用了 Lucene。

Lucene 还为 Eclipse IDE、Nutch(著名的开源 Web 搜索引擎)以及 IBM?、AOL 和 Hewlett-Packard 等公司提供搜索功能。Lucene 已经兼容许多其他编程语言,包括 Perl、Python、C++ 和 .NET。到 2009 年 7 月 30 日止,用于 Java? 编程语言的最新版 Lucene 为 V2.4.1。

Lucene 功能众多:

  • 拥有强大、准确、有效的搜索算法。
  • 计算每个文档匹配给定查询的分数,并根据分数返回最相关的文档。
  • 支持许多强大的查询类型,比如 PhraseQuery、WildcardQuery、RangeQuery、FuzzyQuery、BooleanQuery 等。
  • 支持解析人们输入的丰富查询表达式。
  • 允许用户使用定制排序、过滤和查询表达式解析扩展搜索行为。
  • 使用基于文件的锁定机制保护并发索引修改。
  • 允许同时搜索和编制索引。

?



使用 Lucene 构建应用程序

如图 1 所示,使用 Lucene 构建功能全面的搜索应用程序主要涉及编制数据索引、搜索数据和显示搜索结果几个方面。


图 1. 使用 Lucene 构建应用程序的步骤
使用 Lucene 构建应用程序的步骤

本文从使用 Lucene V2.4.1 和 Java 技术开发的样例应用程序中挑选了一些代码片段。示例应用程序为存储在属性文件中一组电子邮件文档编制索引,并展示了如何使用 Lucene 的查询 API 搜索索引。该示例还让您熟悉基本的索引操作。

?



为数据编制索引

Lucene 允许您为任何文本格式的数据编制索引。Lucene 可以用于几乎任何数据源以及从中提取的文本信息。您可以使用 Lucene 编制索引并搜索 HTML 文档、Microsoft? Word 文档、PDF 文件中存储的数据。编制数据索引的第一步是让数据变成一个简单的文本格式。您可以使用定制解析器和数据转换器实现这一点。

编制索引的过程

编制索引 是将文本数据转换为有利于快速搜索的格式。这类似于书本后面的索引:为您指出主题在书中出现的位置。

Lucene 将输入数据存储在名为逆序 索引的数据结构中, 该数据结构以索引文件集的形式存储在文件系统或内存中。大部分 Web 搜索引擎都使用逆序索引。它允许用户执行快速关键字查询,查找匹配给定查询的文档。在将文本数据添加到索引前,由分析程序(使用分析过程)进行处理。

分析

分析 是将文本数据转换为搜索基本单位(称为项(term))的过程。在分析过程中,文本数据将经历多项操作:提取单词、移除通用单词、忽略标点符号、将单词变为词根形式、将单词变成小写等等。分析过程发生在编制索引和查询解析之前。分析将文本数据转换为标记,这些标记将作为项添加到 Lucene 索引中。

Lucene 有多种内置分析程序,比如 SimpleAnalyzer、StandardAnalyzer、StopAnalyzer、SnowballAnalyzer 等。它们在标记文本和应用过滤器的方式上有所区别。因为分析在编制索引之前移除单词,它减少了索引的大小,但是不利用精确的查询过程。您可以使用 Lucene 提供的基本构建块创建定制分析程序,以自己的方式控制分析过程。表 1 展示了一些内置分析程序及其处理数据的方式。


表 1. Lucene 的内置分析程序

分析程序 对文本数据的操作
WhitespaceAnalyzer 分解空白处的标记
SimpleAnalyzer 分解非字母字符的文本,并将文本转为小写形式
StopAnalyzer 移除虚字(stop word)—— 对检索无用的字,并将文本转为小写形式
StandardAnalyzer 根据一种复杂语法(识别电子邮件地址、缩写、中文、日文、韩文字符、字母数字等等)标记文本
将文本转为小写形式
移除虚字

核心索引编制类

Directory
表示索引文件存储位置的抽象类。有两个常用的子类:
  • FSDirectory — 在实际文件系统中存储索引的 Directory 实现。该类对于大型索引非常有用。
  • RAMDirectory — 在内存中存储所有索引的实现。该类适用于较小的索引,可以完整加载到内存中,在应用程序终止之后销毁。由于索引保存在内存中,所以速度相对较快。
Analyzer
正如上文所述,分析程序负责处理文本数据并将其转换为标记存储在索引中。在编制索引前,IndexWriter 接收用于标记数据的分析程序。要为文本编制索引,您应该使用适用于该文本语言的分析程序。

默认分析程序适用于英语。在 Lucene 沙盒中还有其他分析程序,包括用于中文、日文和韩文的分析程序。

IndexDeletionPolicy
该接口用来实现从索引目录中定