周 登朋 ([email protected]), 软件工程师, 上海交通大学
2006 年 9 月 06 日
在本篇文章中,你会学习到如何利用 Lucene 实现高级搜索功能以及如何利用 Lucene 来创建 Web 搜索应用程序。通过这些学习,你就可以利用 Lucene 来创建自己的搜索应用程序。
架构概览
通常一个 Web 搜索引擎的架构分为前端和后端两部分,就像图一中 所示。在前端流程中,用户在搜索引擎提供的界面中输入要搜索的关键词,这里提到的用户界面一般是一个带有输入框的 Web 页面,然后应用程序将搜索的关键词解析成搜索引擎可以理解的形式,并在索引文件上进行搜索 *** 作。在排序后,搜索引擎返回搜索结果给用户。在后端流程中,网 络爬虫或者机器人从因特网上获取 Web 页面,然后索引子系统解析这些 Web 页面并存入索引文件中。如果你想利用 Lucene 来创建一个 Web 搜索应用程序,那么它的架构也和上面所描述的类似,就如图一中所示。
Figure 1. 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:使用布尔 *** 作符
public void testOperator(String indexDirectory) throws Exception...{
Directory dir = FSDirectory.getDirectory(indexDirectory,false);
IndexSearcher indexSearcher = new IndexSearcher(dir);
String[] searchWords = ...{"Java AND Lucene", "Java NOT Lucene", "Java OR Lucene",
"+Java +Lucene", "+Java -Lucene"};
Analyzer language = new StandardAnalyzer();
Query query;
for(int i = 0; i < searchWords.length; i++)...{
query = QueryParser.parse(searchWords[i], "title", language);
Hits results = indexSearcher.search(query);
System.out.println(results.length() + "search results for query " + searchWords[i]);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)