首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

用 Lucene 加紧 Web 搜索应用程序的开发(转)

2012-08-16 
用 Lucene 加速 Web 搜索应用程序的开发(转)在本篇文章中,你会学习到如何利用 Lucene 实现高级搜索功能以

用 Lucene 加速 Web 搜索应用程序的开发(转)

在本篇文章中,你会学习到如何利用 Lucene 实现高级搜索功能以及如何利用 Lucene 来创建 Web 搜索应用程序。通过这些学习,你就可以利用 Lucene 来创建自己的搜索应用程序。

架构概览

通常一个 Web 搜索引擎的架构分为前端和后端两部分,就像图一中所示。在前端流程中,用户在搜索引擎提供的界面中输入要搜索的关键词,这里提到的用户界面一般是一个带有输入框的 Web 页面,然后应用程序将搜索的关键词解析成搜索引擎可以理解的形式,并在索引文件上进行搜索操作。在排序后,搜索引擎返回搜索结果给用户。在后端流程中,网络爬虫或者机器人从因特网上获取 Web 页面,然后索引子系统解析这些 Web 页面并存入索引文件中。如果你想利用 Lucene 来创建一个 Web 搜索应用程序,那么它的架构也和上面所描述的类似,就如图一中所示。


Figure 1. Web 搜索引擎架构
用 Lucene 加紧 Web 搜索应用程序的开发(转)?

利用 Lucene 实现高级搜索

Lucene 支持多种形式的高级搜索,我们在这一部分中会进行探讨,然后我会使用 Lucene 的 API 来演示如何实现这些高级搜索功能。

布尔操作符

大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 AND, OR, NOT。Lucene 支持 5 种布尔操作符,分别是 AND, OR, NOT, 加(+), 减(-)。接下来我会讲述每个操作符的用法。

  • OR: 如果你要搜索含有字符 A 或者 B 的文档,那么就需要使用 OR 操作符。需要记住的是,如果你只是简单的用空格将两个关键词分割开,其实在搜索的时候搜索引擎会自动在两个关键词之间加上 OR 操作符。例如,“Java OR Lucene” 和 “Java Lucene” 都是搜索含有 Java 或者含有 Lucene 的文档。
  • AND: 如果你需要搜索包含一个以上关键词的文档,那么就需要使用 AND 操作符。例如,“Java AND Lucene” 返回所有既包含 Java 又包含 Lucene 的文档。
  • NOT: Not 操作符使得包含紧跟在 NOT 后面的关键词的文档不会被返回。例如,如果你想搜索所有含有 Java 但不含有 Lucene 的文档,你可以使用查询语句 “Java NOT Lucene”。但是你不能只对一个搜索词使用这个操作符,比如,查询语句 “NOT Java” 不会返回任何结果。
  • 加号(+): 这个操作符的作用和 AND 差不多,但它只对紧跟着它的一个搜索词起作用。例如,如果你想搜索一定包含 Java,但不一定包含 Lucene 的文档,就可以使用查询语句“+Java Lucene”。
  • 减号(-): 这个操作符的功能和 NOT 一样,查询语句 “Java -Lucene” 返回所有包含 Java 但不包含 Lucene 的文档。

    接下来我们看一下如何利用 Lucene 提供的 API 来实现布尔查询。清单1?显示了如果利用布尔操作符进行查询的过程。


    清单1:使用布尔操作符

    域搜索(Field Search)

    Lucene 支持域搜索,你可以指定一次查询是在哪些域(Field)上进行。例如,如果索引的文档包含两个域,Title?和?Content,你就可以使用查询 “Title: Lucene AND Content: Java” 来返回所有在 Title 域上包含 Lucene 并且在 Content 域上包含 Java 的文档。清单 2显示了如何利用 Lucene 的 API 来实现域搜索。


    清单2:实现域搜索

    通配符搜索(Wildcard Search)

    Lucene 支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索 tiny 或者 tony,你就可以使用查询语句 “t?ny”;如果你想查询 Teach, Teacher 和 Teaching,你就可以使用查询语句 “Teach*”。清单3?显示了通配符查询的过程。


    清单3:进行通配符查询

    模糊查询

    Lucene 提供的模糊查询基于编辑距离算法(Edit distance algorithm)。你可以在搜索词的尾部加上字符 ~ 来进行模糊查询。例如,查询语句 “think~” 返回所有包含和 think 类似的关键词的文档。清单 4?显示了如果利用 Lucene 的 API 进行模糊查询的代码。


    清单4:实现模糊查询

    范围搜索(Range Search)

    范围搜索匹配某个域上的值在一定范围的文档。例如,查询 “age:[18 TO 35]” 返回所有 age 域上的值在 18 到 35 之间的文档。清单5显示了利用 Lucene 的 API 进行返回搜索的过程。


    清单5:测试范围搜索
    回页首

    在 Web 应用程序中集成 Lucene

    接下来我们开发一个 Web 应用程序利用 Lucene 来检索存放在文件服务器上的 HTML 文档。在开始之前,需要准备如下环境:

    1. Eclipse 集成开发环境
    2. Tomcat 5.0
    3. Lucene Library
    4. JDK 1.5

    这个例子使用 Eclipse 进行 Web 应用程序的开发,最终这个 Web 应用程序跑在 Tomcat 5.0 上面。在准备好开发所必需的环境之后,我们接下来进行 Web 应用程序的开发。

    1、创建一个动态 Web 项目

    1. 在 Eclipse 里面,选择?File > New > Project,然后再弹出的窗口中选择动态 Web 项目,如图二所示。

    图二:创建动态Web项目
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 在创建好动态 Web 项目之后,你会看到创建好的项目的结构,如图三所示,项目的名称为 sample.dw.paper.lucene。

    图三:动态 Web 项目的结构
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?

    2. 设计 Web 项目的架构

    在我们的设计中,把该系统分成如下四个子系统:

    1. 用户接口: 这个子系统提供用户界面使用户可以向 Web 应用程序服务器提交搜索请求,然后搜索结果通过用户接口来显示出来。我们用一个名为 search.jsp 的页面来实现该子系统。
    2. 请求管理器: 这个子系统管理从客户端发送过来的搜索请求并把搜索请求分发到搜索子系统中。最后搜索结果从搜索子系统返回并最终发送到用户接口子系统。我们使用一个 Servlet 来实现这个子系统。
    3. 搜索子系统: 这个子系统负责在索引文件上进行搜索并把搜索结构传递给请求管理器。我们使用 Lucene 提供的 API 来实现该子系统。
    4. 索引子系统: 这个子系统用来为 HTML 页面来创建索引。我们使用 Lucene 的 API 以及 Lucene 提供的一个 HTML 解析器来创建该子系统。

    图4?显示了我们设计的详细信息,我们将用户接口子系统放到 webContent 目录下面。你会看到一个名为 search.jsp 的页面在这个文件夹里面。请求管理子系统在包?sample.dw.paper.lucene.servlet?下面,类?SearchController?负责功能的实现。搜索子系统放在包sample.dw.paper.lucene.search?当中,它包含了两个类,SearchManager?和?SearchResultBean,第一个类用来实现搜索功能,第二个类用来描述搜索结果的结构。索引子系统放在包?sample.dw.paper.lucene.index?当中。类?IndexManager?负责为 HTML 文件创建索引。该子系统利用包?sample.dw.paper.lucene.util?里面的类?HTMLDocParser?提供的方法?getTitle?和?getContent?来对 HTML 页面进行解析。


    图四:项目的架构设计
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?

    3. 子系统的实现

    在分析了系统的架构设计之后,我们接下来看系统实现的详细信息。

    1. 用户接口: 这个子系统有一个名为 search.jsp 的 JSP 文件来实现,这个 JSP 页面包含两个部分。第一部分提供了一个用户接口去向 Web 应用程序服务器提交搜索请求,如图5所示。注意到这里的搜索请求发送到了一个名为 SearchController 的 Servlet 上面。Servlet 的名字和具体实现的类的对应关系在 web.xml 里面指定。

    图5:向Web服务器提交搜索请求
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?

    这个JSP的第二部分负责显示搜索结果给用户,如图6所示:


    图6:显示搜索结果
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 请求管理器: 一个名为?SearchController?的 servlet 用来实现该子系统。清单6给出了这个类的源代码。

    清单6:请求管理器的实现
    5.在 Tomcat 5.0 上运行应用程序

    现在我们可以在 Tomcat 5.0 上运行开发好的应用程序。

    1. 右键单击?search.jsp,然后选择?Run as > Run on Server,如图7所示。

    图7:配置 Tomcat 5.0
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 在弹出的窗口中,选择?Tomcat v5.0 Server?作为目标 Web 应用程序服务器,然后点击?Next,如图8?所示:

    图8:选择 Tomcat 5.0
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 现在需要指定用来运行 Web 应用程序的 Apache Tomcat 5.0 以及 JRE 的路径。这里你所选择的 JRE 的版本必须和你用来编译 Java 文件的 JRE 的版本一致。配置好之后,点击?Finish。如?图9?所示。

    图9:完成Tomcat 5.0的配置
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 配置好之后,Tomcat 会自动运行,并且会对 search.jsp 进行编译并显示给用户。如?图10?所示。

    图10:用户界面
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 在输入框中输入关键词 “information” 然后单击?Search?按钮。然后这个页面上会显示出搜索结果来,如?图11?所示。

    图11:搜索结果
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?
    1. 单击搜索结果的第一个链接,页面上就会显示出所链接到的页面的内容。如?图12?所示.

    图12:详细信息
    用 Lucene 加紧 Web 搜索应用程序的开发(转)?

    现在我们已经成功的完成了示例项目的开发,并成功的用Lucene实现了搜索和索引功能。你可以下载这个项目的源代码(下载)。

    回页首

    总结

    Lucene 提供了灵活的接口使我们更加方便的设计我们的 Web 搜索应用程序。如果你想在你的应用程序中加入搜索功能,那么 Lucene 是一个很好的选择。在设计你的下一个带有搜索功能的应用程序的时候可以考虑使用 Lucene 来提供搜索功能。

热点排行