求用lucene开发的web网页javaweb搜索引擎擎java代码

使用 Java 开源工具建立一个灵活的搜索引擎
为应用程序添加搜索能力经常是一个常见的需求。尽管已经有若干程序库提供了对搜索基础设施的支持,然而对于很多人而言,使用它们从头开始建立一个搜索引擎将是一个付出不小而且可能乏味的过程。另一方面,很多的小型应用对于搜索功能的需求和应用场景具有很大的相似性。本文试图以对多数小型应用的适用性为出发点,用 Java 语言构建一个灵活的搜索引擎框架。使用这个框架,多数情形下可以以最小的付出建立起一个搜索引擎。最理想的情况下,甚至只需要一个配置文件。特殊的情形下,可以通过灵活地对框架进行扩展满足需求。当然,如题所述,这都是借助开源工具的力量。
Apache Lucene 是开发搜索类应用程序时最常用的 Java 类库,我们的框架也将基于它。为了下文更好的描述,我们需要先了解一些有关 Lucene 和搜索的基础知识。注意,本文不关注索引的文件格式、分词技术等话题。
什么是搜索和索引
从用户的角度来看,搜索的过程是通过关键字在某种资源中寻找特定的内容的过程。而从计算机的角度来看,实现这个过程可以有两种办法。一是对所有资源逐个与关键字匹配,返回所有满足匹配的内容;二是如同字典一样事先建立一个对应表,把关键字与资源的内容对应起来,搜索时直接查找这个表即可。显而易见,第二个办法效率要高得多。建立这个对应表事实上就是建立逆向索引(inverted index)的过程。
Lucene 基本概念
Lucene 是 Doug Cutting 用 Java 开发的用于全文搜索的工具库。在这里,我假设读者对其已有基本的了解,我们只对一些重要的概念简要介绍。要深入了解可以参考 中列出的相关文章和图书。下面这些是 Lucene 里比较重要的类。
Document:索引包含多个 Document。而每个 Document则包含多个 Field对象。Document 可以是从数据库表里取出的一堆数据,可以是一个文件,也可以是一个网页等。注意,它不等同于文件系统中的文件。Field:一个 Field有一个名称,它对应 Document的一部分数据,表示文档的内容或者文档的元数据(与下文中提到的资源元数据不是一个概念)。一个 Field对象有两个重要属性:Store ( 可以有 YES, NO, COMPACT 三种取值 ) 和 Index ( 可以有 TOKENIZED, UN_TOKENIZED, NO, NO_NORMS 四种取值 )Query:抽象了搜索时使用的语句。IndexSearcher:提供 Query对象给它,它利用已有的索引进行搜索并返回搜索结果。Hits:一个容器,包含了指向 一部分搜索结果的指针。
使用 Lucene 来进行编制索引的过程大致为:将输入的数据源统一为字符串或者文本流的形式,然后从数据源提取数据,创建合适的 Field添加到对应数据源的 Document对象之中。
系统概览要建立一个通用的框架,必须对不同情况的共性进行抽象。反映到设计需要注意两点。一是要提供扩展接口;二是要尽量降低模块之间的耦合程度。我们的框架很简单地分为两个模块:索引模块和搜索模块。索引模块在不同的机器上各自进行对资源的索引,并把索引文件(事实上,下面我们会说到,还有元数据)统一传输到同一个地方(可以是在远程服务器上,也可以是在本地)。搜索模块则利用这些从多个索引模块收集到的数据完成用户的搜索请求。展现了整体的框架。可以看到,两个模块之间相对是独立的,它们之间的关联不是通过代码,而是通过索引和元数据。在下文中,我们将会详细介绍如何基于开源工具设计和实现这两个模块。图 1. 系统架构图建立索引可以进行索引的对象有很多,如文件、网页、RSS Feed 等。在我们的框架中,我们定义可以进行索引的 一类对象为 资源。从实现细节上来说,从一个资源中可以提取出多个 Document对象。文件系统资源和数据库结果集资源都是资源的代表性例子。前面提到,从资源中收集到的索引被统一传送到同一个地方,以被搜索模块所用。显然除了索引之外,搜索模块需要对资源有更多的了解,如资源的名称、搜索该资源后搜索结果的呈现格式等。这些额外的附加信息称为资源的 元数据。元数据和索引数据一同被收集起来,放置到某个特定的位置。简要地介绍过资源的概念之后,我们首先为其定义一个 Resource接口。这个接口的声明如下。清单 1. Resource 接口 public interface Resource {
// RequestProcessor 对象被动地从资源中提取 Document,并返回提取的数量
public int extractDocuments(ResourceProcessor processor);
// 添加的 DocumentListener 将在每一个 Document 对象被提取出时被调用
public void addDocumentListener(DocumentListener l);
// 返回资源的元数据
public ResourceMetaData getMetaData();
}其中元数据包含的字段见下表。在下文中,我们还会对元数据的用途做更多的介绍。表 1. 资源元数据包含的字段属性类型含义resourceNameString资源的 唯一名称resourceDescriptionString资源的介绍性文字hitTextPatternString当文档被搜索到时,这个 pattern 规定了结果显示的格式searchableFieldsString[]可以被搜索的字段名称而 DocumentListener的代码如下。清单 2. DocumentListener 接口 public interface DocumentListener extends EventListener {
public void documentExtracted(Document doc);
}为了让索引模块能够知道所有需要被索引的资源,我们在这里使用 风格的 XML 文件配置索引模块中的所有组件,尤其是所有资源。您可以在
查看一个示例配置文件。基于以上内容,我们可以大致描述出索引模块工作的过程:
首先在 XML 配置的 bean 中找出所有 Resource对象;对每一个调用其 extractDocuments()方法,这一步除了完成对资源的索引外,还会在每次提取出一个 Document对象之后,通知注册在该资源上的所有 DocumentListener;接着处理资源的元数据(getMetaData()的返回值);将缓存里的数据写入到本地磁盘或者传送给远程服务器;在这个过程中,有两个地方值得注意。第一,对资源可以注册 DocumentListener使得我们可以在运行时刻对索引过程有更为动态的控制。举一个简单例子,对某个文章发布站点的文章进行索引时,一个很正常的要求便是发布时间更靠近当前时间的文章需要在搜索结果中排在靠前的位置。每篇文章显然对应一个 Document对象,在 Lucene 中我们可以通过设置 Document的 boost值来对其进行加权。假设其中文章发布时间的 Field的名称为 PUB_TIME,那么我们可以为资源注册一个 DocumentListener,当它被通知时,则检测 PUB_TIME的值,根据距离当前时间的远近进行加权。第二点很显然,在这个过程中,extractDocuments()方法的实现依不同类型的资源而各异。下面我们主要讨论两种类型的资源:文件系统资源和数据库结果集资源。这两个类都实现了上面的 接口。文件系统资源对文件系统资源的索引通常从一个基目录开始,递归处理每个需要进行索引的文件。该资源有一个字符串数组类型的 excludedFiles属性,表示在处理文件时需要排除的文件绝对路径的正则表达式。在递归遍历文件系统树的同时,绝对路径匹配 excludedFiles中任意一项的文件将不会被处理。这主要是考虑到一般我们只需要对一部分文件夹(比如排除可能存在的备份目录)中的一部分文件(如 doc, ppt 文件等)进行索引。除了所有文件共有的文件名、文件路径、文件大小和修改时间等 Field,不同类型的文件需要有不同的处理方法。为了保留灵活性,我们使用 Strategy 模式封装对不同类型文件的处理方式。为此我们抽象出一个 DocumentBuilder的接口,该接口仅定义了一个方法如下:清单 3. DocumentBuilder 接口 public interface DocumentBuilder {
Document buildDocument(InputStream is);
}不同的 DocumentBuilder(Strategy) 用于从一个输入流中读取数据,处理不同类型的文件。对于常见的文件格式来说,都有合适的开源工具帮助进行解析。在下表中我们列举一些常见文件类型的解析办法。文件类型常用扩展名可以使用的解析办法纯文本文档txt无需类库解析RTF 文档rtf使用 javax.swing.text.rtf.RTFEditorKit类Word 文档(非 OOXML 格式)docApache POI (可配合使用 POI Scratchpad)PowerPoint 演示文稿(非 OOXML 格式)xlsApache POI (可配合使用 POI Scratchpad)PDF 文档pdfPDFBox(可能中文支持欠佳)HTML 文档htm, htmlJTidy, Cobra这里以 Word 文件为例,给出一个简单的参考实现。清单 4. 解析纯文本内容的实现 // WordDocument 是 Apache POI Scratchpad 中的一个类
Document buildDocument(InputStream is) {
String bodyText =
WordDocument wordDoc = new WordDocument(is);
StringWriter sw = new StringWriter();
wordDoc.writeAllText(sw);
sw.close();
bodyText = sw.toString();
} catch (Exception e) {
throw new DocumentHandlerException("Cannot extract text from a Word document", e);
if ((bodyText != null) && (bodyText.trim().length() & 0)) {
Document doc = new Document();
doc.add(new Field("body", bodyText, Field.Store.YES, Field.Index.TOKENIZED));
}那么如何选择合适的 Strategy 来处理文件呢? UNIX 系统下的 file(1) 工具提供了从 获取文件类型的功能,我们可以使用 Runtime.exec()方法调用这一命令。但这需要在有 file(1) 命令的情况下,而且并不能识别出所有文件类型。在一般的情况下我们可以简单地根据扩展名来使用合适的类处理文件。扩展名和类的映射关系写在 properties 文件中。当需要添加对新的文件类型的支持时,我们只需添加一个新的实现 DocumentBuilder接口的类,并在映射文件中添加一个映射关系即可。数据库结果集资源大多数应用使用数据库作为永久存储,对数据库查询结果集索引是一个常见需求。生成一个数据库结果集资源的实例需要先提供一个查询语句,然后执行查询,得到一个结果集。这个结果集中的内容便是我们需要进行索引的对象。extractDocuments的实现便是为结果集中的每一行创建一个 Document对象。和文件系统资源不同的是,数据库资源需要放入 Document中的 Field一般都存在在查询结果集之中。比如一个简单的文章发布站点,对其后台数据库执行查询 SELECT ID, TITLE, CONTENT FROM ARTICLE返回一个有三列的结果集。对结果集的每一行都会被提取出一个 Document对象,其中包含三个 Field,分别对应这三列。然而不同 Field的类型是不同的。比如 ID字段一般对应 Store.YES和 Index.NO的 Field;而 TITLE字段则一般对应 Store.YES和 Index.TOKENIZED的 Field。为了解决这个问题,我们在数据库结果集资源的实现中提供一个类型为 Properties的 fieldTypeMappings属性,用于设置数据库字段所对应的 Field的类型。对于前面的情况来说,这个属性可能会被配置成类似这样的形式: ID = YES, NO
TITLE = YES, TOKENIZED
CONTENT = NO, TOKENIZED配合这个映射,我们便可以生成合适类型的 Field,完成对结果集索引的工作。收集索引完成对资源的索引之后,还需要让索引为搜索模块所用。前面我们已经说过这里介绍的框架主要用于小型应用,考虑到复杂性,我们采取简单地将分布在各个机器上的索引汇总到一个地方的策略。汇总索引的传输方式可以有很多方案,比如使用 FTP、HTTP、rsync 等。甚至索引模块和搜索模块可以位于同一台机器上,这种情况下只需要将索引进行本地拷贝即可。同前面类似,我们定义一个 Transporter接口。清单 5. Transporter 接口 public interface Transporter {
public void transport(File file);
}以 FTP 方式传输为例,我们使用 Commons Net 完成传输的操作。 public void transport(File file) throws TransportException {
FTPClient client = new FTPClient();
client.connect(host);
client.login(username, password);
client.changeWorkingDirectory(remotePath);
transportRecursive(client, file);
client.disconnect();
public void transportRecursive(FTPClient client, File file) {
if (file.isFile() && file.canRead()) {
client.storeFile(file.getName(), new FileInputStream(file));
} else if (file.isDirectory()) {
client.makeDirectory(file.getName());
client.changeWorkingDirectory(file.getName());
File[] fileList = file.listFiles();
for (File f : fileList) {
transportRecursive(client, f);
}对其他传输方案也有各自的方案进行处理,具体使用哪个 Transporter的实现被配置在 Spring 风格的索引模块配置文件中。传输的方式是灵活的。比如当需要强调安全性时,我们可以换用基于 SSL 的 FTP 进行传输。所需要做的只是开发一个使用 FTP over SSL 的 Transporter实现,并在配置文件中更改 Transporter的实现即可。进行搜索在做了这么多之后,我们开始接触和用户关联最为紧密的搜索模块。注意,我们的框架不包括一个搜索的 Web 前端界面。但是类似这样的界面可以在搜索模块的基础上方便地开发出来。基于已经收集好的索引进行搜索是个很简单的过程。Lucene 已经提供了功能强大的 IndexSearcher及其子类。在这个部分,我们不会再介绍如何使用这些类,而是关注在前文提到过的资源元数据上。元数据从各个资源所在的文件夹中读取得到,它在搜索模块中扮演重要的角色。构建一个查询对不同资源进行搜索的查询方法并不一样。例如搜索一个论坛里的所有留言时,我们关注的一般是留言的标题、作者和内容;而当搜索一个 FTP 站点时,我们更多关注的是文件名和文件内容。另一方面,我们有时可能会使用一个查询去搜索多个资源的结果。这正是之前我们在前面所提到的元数据中 和 属性的作用。前者指出一个资源中哪些字段是参与搜索的;后者则用于在搜索时确定使用哪个或者哪些索引。从技术细节来说,只有有了这些信息,我们才可以构造出可用的 Query对象。呈现搜索结果当从 IndexSearcher对象得到搜索结果(Hits)之后,当然我们可以直接从中获取需要的值,再格式化予以输出。但一来格式化输出搜索结果(尤其在 Web 应用中)是个很常见的需求,可能会经常变更;二来结果的呈现格式应该是由分散的资源各自定义,而不是交由搜索模块来定义。基于上面两个原因,我们的框架将使用在资源收集端配置结果输出格式的方式。这个格式由资源元数据中的 属性定义。该属性是一个字符串类型的值,支持两种语法
形如 ${field_name}的子字符串都会被动态替换成查询结果中各个 Document内 Field的值。形如 $function(...)的被解释为函数,括号内以逗号隔开的符号都被解释成参数,函数可以嵌套。
例如搜索“具体”返回的搜索结果中包含一个 Document对象,其 Field如下表:Field 名称Field 内容urlhttp://example.org/article/1.htmltitle示例标题content这里是具体的内容。那么如果 hitTextPatten被设置为“&a href="${url}"&${title}&/a&&br/&$highlight(${content}, 5, "&b&", "&/b&")”,返回的结果经浏览器解释后可能的显示结果如下(这只是个演示链接,请不要点击):这里是 具体...上面提到的 $highlight()函数用于在搜索结果中取得最匹配的一段文本,并高亮显示搜索时使用的短语,其第一个参数是高亮显示的文本,第二个参数是显示的文本长度,第三和第四个参数是高亮文本时使用的前缀和后缀。可以使用正则表达式和文本解析来实现前面所提到的语法。我们也可以使用 定义 hitTextPattern的文法,进而生成词法分析器和语法解析器。这是更为系统并且相对而言不易出错的方法。对 JavaCC 的介绍不是本文的重点,您可以在下面的 中找到学习资料。相关产品下面列出的是一些与我们所提出的框架所相关或者类似的产品,您可以在 中更多地了解他们。IBM®OmniFind™FamilyOmniFind 是 IBM 公司推出的企业级搜索解决方案。基于 UIMA (Unstructured Information Management Architecture) 技术,它提供了强大的索引和获取信息功能,支持巨大数量、多种类型的文档资源(无论是结构化还是非结构化),并为 Lotus®Domino®和 WebSphere®Portal 专门进行了优化。Apache SolrSolr 是 Apache 的一个企业级的全文检索项目,实现了一个基于 HTTP 的搜索服务器,支持多种资源和 Web 界面管理,它同样建立在 Lucene 之上,并对 Lucene 做了很多扩展,例如支持动态字段及唯一键,对查询结果进行动态分组和过滤等。Google SiteSearch使用 Google 的站点搜索功能可以方便而快捷地建立一个站内搜索引擎。但是 Google 的站点搜索基于 Google 的网络爬虫,所以无法访问受保护的站点内容或者 Intranet 上的资源。另外,Google 所支持的资源类型也是有限的,我们无法对其进行扩展。SearchBlox™是一个商业的搜索引擎构建框架。它本身是一个 J2EE 组件,和我们的框架类似,也支持对网页和文件系统等资源进行索引,进而进行搜索。还需考虑的问题本文介绍的思想试图利用开源的工具解决中小型应用中的常见问题。当然,作为一个框架,它还有很多不足,
下面列举出一些可以进行改进的地方。性能考虑当需要进行索引的资源数目不多时,隔一定的时间进行一次完全索引不会占用很长时间。使用一台
2G 内存,Xeon 2.66G 处理器的服务器进行实际测试,发现对数据库资源的索引占用的时间很少,一千多条记录花费的时间在 1 秒到 2 秒之内。而对 1400 多个文件进行索引耗时大约十几秒。但在大型应用中,资源的容量是巨大的,如果每次都进行完整的索引,耗费的时间会很惊人。我们可以通过跳过已经索引的资源内容,删除已不存在的资源内容的索引,并进行增量索引来解决这个问题。这可能会涉及文件校验和索引删除等。另一方面,框架可以提供查询缓存来提高查询效率。框架可以在内存中建立一级缓存,并使用如 或 实现磁盘上的二级缓存。当索引的内容变化不频繁时,使用查询缓存更会明显地提高查询速度、降低资源消耗。分布式索引我们的框架可以将索引分布在多台机器上。搜索资源时,查询被 flood 到各个机器上从而获得搜索结果。这样可以免去传输索引到某一台中央服务器的过程。当然也可以基于实现了分布式哈希表 (DHT)的结构化 P2P 网络,配合索引复制 (Replication),使得应用程序更为安全,可靠,有伸缩性。在 中给出了 一篇关于构建分布式环境下全文搜索的可行性的论文。
安全性目前我们的框架并没有涉及到安全性。除了依赖资源本身的访问控制(如受保护的网页和文件系统等)之外,我们还可以从两方面增强框架本身的安全性:
考虑到一个组织的搜索功能对不同用户的权限设置不一定一样,可以支持对用户角色的定义,实行对搜索模块的访问控制。在资源索引模块中实现一种机制,让资源可以限制自己暴露的内容,从而缩小索引模块的索引范围。这可以类比
robots 文件可以规定搜索引擎爬虫的行为。总结通过上文的介绍,我们认识了一个可扩展的框架,由索引模块和搜索模块两部分组成。它可以灵活地适应不同的应用场景。如果需要更独特的需求,框架本身预留了可以扩展的接口,我们可以通过实现这些接口完成功能的定制。更重要的是这一切都是建立在开源软件的基础之上。希望本文能为您揭示开源的力量,体验用开源工具组装您自己的解决方案所带来的莫大快乐。
下载资源 (config.zip | 2 KB)相关主题是作者对上文所描述方案的实现,目前尚处于初级阶段。IBM developerWorks 上关于 Apache Lucene 的一些 和 。阅读 这里了解 magic number 的定义;而这个 列出了 Linux 系统常见文件格式的 magic number。这篇 提出了解决 PDFBox 中文问题的一种办法。( 英文 )。阅读 dW 上“使用 Apache Solr 实现更加灵巧的搜索 (2007 年 7 月 )”的 和 帮助您了解 Apache Solr。 讨论了 P2P 环境下全文搜索的可能性。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Java technology, Open sourceArticleID=271260ArticleTitle=使用 Java 开源工具建立一个灵活的搜索引擎publish-date=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&1. 新增扫二维码功能,可直接扫 VeryCD 网站影片页面的二维码,便能在应用上打开;
2. 新增支持 B 站视频(哔哩哔哩),满屏的弹幕更欢乐;
1. 新增支持 B 站视频(哔哩哔哩),满屏的弹幕更欢乐;
2. 在影片封面上展示在线视频的清晰度;
您的位置:
地区(语言):&大陆(普通话) 发行日期:&2006年
收藏人数: 345
图书分类:&网络出版社:&语言:&,
收藏资源后,一旦有新更新(字幕、文件)我们
将会用站内消息和电子邮件通知你。
收藏资源后,一旦有新更新(字幕、文件)我们
将会用站内消息和电子邮件通知你。
该内容尚未提供权利证明,无法提供下载。
中文名:&开发自己的搜索引擎——Lucene+Heritrix(第2版)[PDF+随书光盘]作者:&图书分类:&网络资源格式:&PDF版本:&第二版出版社:&书号:&地区:&语言:&,简介:&
内容简介  《开发自己的搜索引擎:Lucene+Heritrix(第2版)》是一本介绍搜索引擎开发的书籍,通过《开发自己的搜索引擎:Lucene+Heritrix(第2版)》,读者可以独立构建一个企业级的搜索引擎网站。《开发自己的搜索引擎:Lucene+Heritrix(第2版)》讲解了搜索引擎与信息检索基础,Lucene入门实例,索引的建立,使用Lucene来搜索,排序,分析器,对Word、Excel和PDF格式文档的解析,Compass搜索引擎框架,Lucene分布式,爬虫Heritrix,HTMLParser,DWR等内容。最后综合这些技术,构建了一个典型的垂直搜索系统,具有很强的商业实用价值。  《开发自己的搜索引擎:Lucene+Heritrix(第2版)》是一本使用Lucene和Heritrix来讲解搜索引擎构建的书,通过对API和源代码的分析,力求使读者在应用的基础上,能够深入其核心,自行扩展和开发相应组件,发挥想象力,开发出更具有创意的搜索引擎产品。  《开发自己的搜索引擎:Lucene+Heritrix(第2版)》适合Java程序员和从事计算机软件开发的编程人员阅读,同时也可以作为搜索引擎爱好者的入门书籍。作者简介  邱哲,北京理工大学软件工程硕士。现为Eskalate.com公司技术经理,同时负责开发人员招聘工作一-主要从事欧美软件外包开发,曾承接多家美国本土公司项目,在J2EE方面有7年的开发经验。曾经编写了《souts Web设计与开发大全》、《开发自己的搜索引擎——Lucerie 2.0+Heritrix》。  王学松,博士。曾任职知名互联网搜索引擎公司,担任高级软件工程师、研发经理等职位,参与大型搜索引擎开发多年。开发完成亿级网页的互联网科技类信息垂直搜索引擎系统,完成中文搜索引擎的页面下载与分析、大规模索引建立、分类聚类技术、高并发检索和Web高速访问技术开发。目前从事海量信息挖掘、语义网搜索引擎和基于内容图像检索的研究和开发。 内容截图:光盘内容1.光盘中所附代码的运行环境
服务器Tomcat5.5版本
数据库采用MySQL 5.0 版本
JDK采用1.5.0
Spring采用1.2.8版本
DWR采用1.1.3版本
Windows平台
Tomcat 插件TomcatPlugin(下载地址:/eclipse/tomcatpluginfr )2.本书所附光盘范例Eclipse工程/ch2:原书第二章Eclipse工程文件
对文档预处理的源代码
对文档建立索引的源代码
对文档检索的源代码
使用Lucene检索和使用java.lang.String内置方法进行检索的效率比较安装:直接在Eclipse中选取“import-&Existing Project”Eclipse工程/ch7-9:原书第七章和第九章的Eclipse工程文件
使用PDFBox解析PDF文件
使用xpdf解析中文PDF文件
使用POI解析WORD和Excel文件
使用Jacob解析WORD文件
Google的Search API的使用安装:直接在Eclipse中选取“import-&Existing Project”Eclipse工程/ch10/heritrixProject:本书第十章的工程文件
在Eclipse配置完成的Heritrix源代码
自行开发的Heritrix的Extractor类:pconline
自行开发的Heritrix的FrontierScheduler类:pconline
自行开发的Heritrix的Extractor类:163mobile
自行开发的Heritrix的FrontierScheduler类:163mobile安装:直接在Eclipse中选取“import-&Existing Project”Eclipse工程/ch13/SimpleRegex:本书第十三章的工程文件
正则表达式java.util.regex包及自行开发的内容提取示例源代码
解析产品网页信息的基类Extractor类的源代码
自行开发的HTMLParser提取星座内容类:AstroHTMLParserExtractorTest
自行开发的pconline产品页面解析类:ExtractPconlineMoblie
自行开发的网易手机频道产品信息解析类:Extract163Moblie安装:直接在Eclipse中选取“import-&Existing Project”Eclipse工程/ ch14-ch16/z_mysearch:本书第十四及十六章综合实例的工程文件
自行开发的第11章Tomcat的Web工程框架及示例源代码
自行开发的第14章索引与数据库处理类包com/luceneheritrixbook/core的源代码
自行开发的第16章Web工程中搜索Bean类:SearchResult、SearchResults、SearchRequest
自行开发的第16章数据库访问SearchResultDAO类源代码
自行开发的第16章Lucene索引检索SearchService类源代码
自行开发的第16章前台Web页面:搜索页面、详细页面和图片显示页面安装:直接在Eclipse中选取“import-&Existing Project”Eclipse工程/ ch15/z_ testDWR:本书第十五章的工程文件
加载DWR支持的Tomcat工程testDWR源代码
DWR中支持Ajax框架的DateWrapper类及自行开发的test.jsp示例源代码
DWR中转换器converter的实现及自行开发的向后台传递参数的示例源代码
自行开发的调用DWR中工具库util.js示例源代码安装:直接在Eclipse中选取“import-&Existing Project”注: mirror.rar文件是使用Heritrix从pconline网上抓取的手机信息页面(以网站镜象格式存储),在本书最后搜索引擎完整实例中需要使用到。笔者删除了原始镜像目录中一部分的网页,可能执行效果和书上不能完全一致,请读者读懂原理后灵活处理。mirror.rar的下载地址可以在本书本书支持页面/lucene1001/blog查找
第1章 搜索引擎与信息检索 11.1 搜索引擎的历史 11.1.1 萌芽:Archie、Gopher 11.1.2 起步:Robot(网络机器人)的出现与Spider(网络爬虫) 31.1.3 发展:Excite、Galaxy、Yahoo等 41.1.4 繁荣:Infoseek、AltaVista、Google和Baidu 61.2 信息检索系统的基本知识 91.2.1 信息检索系统 91.2.2 信息检索的过程 111.2.3 传统查找的优点和不足 121.2.4 使用索引提高检索速度 121.2.5 倒排索引 131.2.6 评价信息检索系统的标准 141.3 Lucene的简介 141.4 小结 15第2章 Lucene入门实例 162.1 实例介绍 162.1.1 实例说明 162.1.2 开发过程 162.2 准备工作 172.2.1 将文档的全角标点转成半角标点 172.2.2 将大文档切分成多个小文档 202.2.3 预处理源文件的统一接口 212.3 创建Eclipse工程 222.3.1 准备工作 222.3.2 创建工程并引入Lucene的JAR包 242.3.3 运行文档预处理类 312.3.4 创建处理文档的索引类:IndexProcessor 322.3.5 创建检索索引的搜索类 342.4 运行效果 382.5 小结 41第3章 索引的建立 423.1 Document逻辑文件 423.1.1 Lucene的Document 423.1.2 为Document添加多种Field 433.1.3 Document的内部实现 453.2 Field的内部实现 463.2.1 Field包含的类 473.2.2 Field类的构造方法 483.3 Lucene的索引工具IndexWriter 493.3.1 IndexWriter的初始化 503.3.2 向索引添加文档 523.3.3 限制每个Field中的词条的数量 533.4 Lucene索引过程详解 543.4.1 Lucene索引建立过程概览 543.4.2 使用addDocument方法向索引添加文档 553.4.3 DocumentWriter的addDocument方法 573.4.4 文档的倒排 623.4.5 对postingTable进行排序 663.4.6 将Posting信息写入索引 683.5 索引文件格式 683.5.1 索引的segment 693.5.2 .fnm格式 693.5.3 .fdx与.fdt格式 703.5.4 .tii与.tis格式 713.5.5 deletable格式 713.5.6 复合索引格式.cfs 713.6 索引过程的调优 723.6.1 合并因子mergeFactor 723.6.2 maxMergeDocs 733.6.3 minMergeDocs 733.7 索引的合并与索引的优化 743.7.1 FSDirectory与RAMDirectory 743.7.2 使用IndexWriter来合并索引 753.7.3 索引的优化 763.8 从索引中删除文档 783.8.1 索引的读取工具Index-Reader 783.8.2 使用文档ID号来删除特定文档 813.8.3 使用Field信息来删除批量文档 843.9 Lucene的同步问题 853.9.1 为什么要进行同步以及Lucene的同步法则 853.9.2 commit.lock与write.lock 853.10 Lucene 2.0的新类:IndexModifier类 863.11 小结 87第4章 Lucene搜索 884.1 使用IndexSearcher进行搜索 884.1.1 初始化IndexSearcher 884.1.2 IndexSearcher的最简单使用 894.1.3 IndexSearcher的多种search方法 904.2 Hits类详解 924.2.1 Hits类的公有接口 924.2.2 效率分析 934.2.3 Hits内部的缓存 954.2.4 Hits类的工作原理 984.3 对搜索结果的评分 984.3.1 文档与词条的向量空间 984.3.2 Lucene的文档得分算法 994.4 构建各种Lucene内建的Query对象 1034.4.1 toString:查看原子查询 1034.4.2 查询重写与权重 1034.4.3 TermQuery词条搜索 1044.4.4 BooleanQuery布尔搜索 1054.4.5 RangeQuery范围搜索 1134.4.6 PrefixQuery前缀搜索 1174.4.7 PhraseQuery:短语搜索 1194.4.8 MultiPhraseQuery:多短语搜索 1234.4.9 FuzzyQuery模糊搜索 1284.4.10 WildcardQuery通配符搜索 1314.4.11 SpanQuery跨度搜索 1324.5 第三方提供的Query对象:RegexQuery 1404.6 通过QueryParser转换用户关键字 1424.6.1 词条的定义 1434.6.2 QueryParser初始化 1434.6.3 改变QueryParser默认的布尔逻辑 1444.6.4 短语和QueryParser 1454.6.5 FuzzyQuery和QueryParser 1474.6.6 通配符与QueryParser 1474.6.7 查找指定的Field 1484.6.8 RangeQuery与QueryParser 1514.6.9 QueryParser和SpanQuery 1524.7 多Field搜索与多索引搜索 1534.7.1 多域搜索MultiFieldQuery-Parser 1534.7.2 MultiSearcher在多个索引上搜索 1554.7.3 ParalellMultiSearcher:多线程搜索 1584.7.4 Searchable和RMI 1614.8 小结 162第5章 排序、过滤和分页 1635.1 相关度排序 1635.1.1 使用Score进行自然排序 1635.1.2 Searcher的explain方法 1655.1.3 通过改变boost值来改变文档的得分 1665.2 使用Sort来排序 1705.2.1 Sort简介 1705.2.2 SortField 1715.2.3 按文档得分进行排序 1725.2.4 按文档的内部ID号来排序 1755.2.5 按一个或多个Field来排序 1755.2.6 改变SortField中的Locale信息 1825.3 搜索的过滤器 1835.3.1 过滤器的基本结构 1835.3.2 一个简单的Filter:建立索引 1845.3.3 一个简单的Filter:打印索引文档信息 1865.3.4 一个简单的Filter:安全级别与过滤器代码 1875.3.5 一个简单的Filter:在搜索时应用过滤器 1885.3.6 一个简单的Filter:总结 1905.3.7 按范围过滤RangeFilter 1905.3.8 在结果中查询QueryFilter 1945.3.9 缓存结果:Caching-WrapperFilter 1975.4 翻页问题 1985.4.1 依赖于session的翻页 1985.4.2 多次查询 1985.4.3 缓存+多次查询 1995.4.4 缓存+多次查询+数据库 1995.5 小结 200第6章 Lucene的分析器 2016.1 分析 2016.1.1 分词 2016.1.2 Lucene的分析器结构 2026.1.3 Lucene的分析器实现 2046.2 Lucene与JavaCC 2056.2.1 JavaCC简介 2056.2.2 JavaCC为Lucene提供的分析器脚本 2066.2.3 Lucene的标准分析器 2106.2.4 标准过滤器:Standard-Filter 2116.2.5 大小写转换器:Lower-CaseFilter 2126.2.6 忽略词过滤器:StopFilter 2136.3 分析器的进阶 2136.3.1 再看StandardAnalyzer中的管道过滤器结构 2146.3.2 长度过滤器:LengthFilter 2146.3.3 PerFieldAnalyzerWrapper 2156.3.4 其他 2156.4 对中文的分析 2166.4.1 现有的中文分词方式简介 2166.4.2 中科院的分词软件和JE分词 2186.5 小结 224第7章 Word、Excel和PDF的处理 2257.1 使用PDFBox处理PDF文档 2257.1.1 PDFBox的下载 2257.1.2 在Eclipse中配置 2267.1.3 使用PDFBox解析PDF内容 2277.1.4 运行效果 2287.1.5 与Lucene的集成 2307.2 使用xpdf来处理中文PDF文档 2327.2.1 xpdf的下载 2327.2.2 配置 2327.2.3 提取中文 2337.2.4 运行效果 2367.3 使用POI来处理Excel和Word文件格式 2377.3.1 对Excel的处理类 2377.3.2 ExcelReader的运行效果 2417.3.3 POI中Excel文件Cell的类型 2437.3.4 对Word的处理类 2457.4 使用Jacob来处理Word文档 2477.4.1 Jacob的下载 2477.4.2 在Eclipse中配置 2477.5 小结 249第8章 Compass:封装了Lucene的框架 2508.1 Compass简介 2508.1.1 Compass的下载 2508.1.2 Compass的代码片断 2508.2 Compass的初始配置 2528.2.1 Compass的配置文件 2528.2.2 将索引存放于内存中 2538.2.3 使用JDBC来存储索引 2538.2.4 使用连接池来存储索引 2548.2.5 加载compass.cfg.xml文件 2558.3 域模型的配置 2558.3.1 实体代码 2558.3.2 实体关系 2618.3.3 实体Book的配置文件 2628.3.4 通用元数据定义文件(.cmd.xml) 2638.3.5 Author和Article的配置文件 2678.4 使用Compass来建立索引 2698.4.1 索引代码 2698.4.2 对象关系图和运行结果 2718.5 使用Compass来搜索 2728.5.1 使用find()方法搜索 2728.5.2 CompassHits类型 2738.5.3 CompassHit类型 2748.5.4 使用Lucene语法来查找 2758.6 配置Analyzer和Optimizer 2768.7 小结 277第9章 Lucene分布式 2789.1 Lucene与分布式 2789.1.1 什么是GFS 2789.1.2 为Lucene提供分布式的几点设想 2799.2 小结 281第10章 无比强大的网络爬虫Heritrix 28210.1 Heritrix的使用入门 28210.1.1 下载和运行Heritrix 28210.1.2 在Eclipse里配置heritrix的开发环境 28510.1.3 创建一个新的抓取任务 29010.1.4 设置抓取时的处理链 29210.1.5 设置运行时的参数 29510.1.6 运行抓取任务 29710.1.7 Heritrix的镜像存储结构 30210.1.8 终止抓取或终止Heritrix的运行 30310.2 Heritrix的架构 30410.2.1 抓取任务CrawlOrder 30410.2.2 中央控制器CrawlController 30510.2.3 Frontier链接制造工厂 30810.2.4 用Berkeley DB实现的BdbFrontier 31310.2.5 Heritrix的多线程ToeThread和ToePool 31610.2.6 处理链和Processor 31910.3 扩展和定制Heritrix 32210.3.1 向Heritrix中添加自己的Extractor 32310.3.2 定制Queue-assignment-policy两个问题 32710.3.3 定制Queue-assignment-policy继承 QueueAssignmentPolicy类 32810.3.4 扩展FrontierScheduler来抓取特定的内容 32910.3.5 在Prefetcher中取消robots.txt的限制 33010.4 小结 331第11章 搜索引擎综合实例:准备篇 33211.1 数码产品垂直搜索引擎实例简介 33211.1.1 垂直搜索引擎实现流程 33211.1.2 数码垂直搜索引擎搜索功能 33311.1.3 信息来源网站的选择方法 33311.1.4 太平洋电脑网和网易手机频道 33411.2 准备Eclipse的Web开发环境 33511.2.1 准备Eclipse的Web插件环境 33511.2.2 在Eclipse中配置插件 33611.3 准备垂直搜索引擎工程 33711.3.1 建立搜索引擎Eclipse工程 33811.3.2 设置搜索引擎工程上下文信息 33911.3.3 设定源代码存放和输出路径 34011.3.4 添加自定义的Java代码 34111.3.5 添加工程中引用的Jar包 34311.3.6 创建工程JSP页面文件 34511.3.7 构造完成的工程整体结构 34711.4 搜索引擎配置信息管理及相关类 34911.4.1 工程配置信息管理 34911.4.2 系统属性配置文件 35011.4.3 配置文件管理封装类 35011.5 小结 352第12章 搜索引擎综合实例:下载篇 35312.1 数码产品网络爬虫 35312.1.1 垂直搜索引擎网络爬虫设计 35312.1.2 来源网站内容与链接分析 35412.2 数码产品信息来源列表准备 35612.2.1 太平洋电脑网待抓取内容页面分析 35612.2.2 太平洋电脑网带抓取内容代码分析 35912.2.3 太平洋电脑网手机品牌清单分析 36212.3 Eclipse中定制数码产品Heritrix爬虫 36712.3.1 数码产品Heritrix爬虫的功能 36712.3.2 Eclipse中导入编译Heritrix工程 36812.3.3 Eclipse中运行Heritrix工程 37012.4 抓取pconline网页的定制扩展类 37112.4.1 抓取pconline网页的Frontier扩展 37112.4.2 执行pconline手机网页抓取任务 37312.5 抓取网易手机频道的定制扩展类 37512.5.1 网易手机频道结构分析 37512.5.2 设计网易抓取的Extractor扩展 37812.5.3 设计网易抓取的Frontier扩展 38112.5.4 执行网易手机频道网页抓取任务 38212.6 小结 383第13章 使用正则表达式与HTML Parser分析网页 38413.1 网页内容分析方法概述 38413.1.1 网页HTML的基本知识 38413.1.2 JDK正则表达式简介 38513.1.3 HTMLParser开源库介绍 38713.2 正则表达式精确提取网页内容 38813.2.1 正则表达式java.util.regex使用 38813.2.2 正则表达式提取tom星座内容实例 39013.2.3 正则表达式提取pconline手机品牌列表 39613.3 HTMLParser高效提取网页内容 39813.3.1 HTMLParser使用准备 39813.3.2 Lexer模式功能及实现 39913.3.3 HTMLParser功能及实现 40413.3.4 HTMLParser解析星座网页实例 41013.4 数码产品网页内容解析系统 41313.4.1 产品详细信息文件格式 41313.4.2 解析产品网页信息的基类Extractor 41413.5 pconline手机产品网页内容解析 41813.5.1 pconline手机产品页面Extractor解析器 41813.5.2 pconline产品信息解析测试函数 42113.5.3 pconline产品信息解析代码执行结果 42213.6 网易手机频道产品内容解析 42513.6.1 网易手机频道产品信息的Extractor解析器 42513.6.2 网易手机频道的产品信息运行测试效果 42813.7 小结 429第14章 网页内容存储与索引 43014.1 构建产品检索名称信息词库 43014.1.1 产品名称词汇选择 43014.1.2 产品名称词库提取代码 43114.1.3 产品名称词库提取结果 43314.2 手机产品数据库与文件索引结构 43414.2.1 手机产品的存储方法 43414.2.2 手机产品信息Product类 43514.2.3 产品信息数据库存储结构 43714.2.4 产品信息Lucene索引结构 43814.3 产品信息数据库存储与处理 43914.3.1 数据库创建与准备 43914.3.2 Java数据库基本操作 44014.3.3 数码产品数据库记录操作 44114.4 产品信息文件存储与Lucene索引 44314.4.1 数码产品Lucene索引操作设计 44314.4.2 数码产品具体索引操作代码 44514.5 产品信息综合处理与运行 44614.5.1 调用数据库处理类和索引处理类 44614.5.2 数码产品数据处理类运行 45214.6 小结 454第15章 搜索引擎综合实例:交互篇 45515.1 DWR的技术介绍 45515.1.1 Ajax与DWR简介 45515.1.2 Ajax与传统模式搜索架构 45615.2 DWR安装与配置 45715.2.1 DWR的下载与安装 45715.2.2 创建工程结构 45815.2.3 配置web.xml内容 46015.2.4 建立配置dwr.xml内容 46115.3 DWR入门与实例演示 46115.3.1 简单Ajax页面代码 46115.3.2 运行效果与对比 46415.3.3 DWR与直接使用XMLHttpRequest对象的比较 46815.3.4 在DWR中操纵自定义的对象 47015.3.5 查看DWR的输出日志 47715.4 dwr.xml的配置进阶 47715.4.1 dwr.xml的标准结构 47815.4.2 init标签与DWR自带的converter和creator 47915.4.3 allow标签 48315.4.4 signature标签 48415.4.5 转换器converter 48515.5 使用DWR工具库util.js 48815.5.1 页面中调用util.js 48915.5.2 使用useLoadingMessage()方法显示提示图标 49015.5.3 DWRUtil.setValue()和DWRUtil.getValue() 49515.5.4 DWRUtil.getValues和DWRUtil.setValues 49815.5.5 DWRUtil.addOptions和DWRUtil.removeAll-Options 50315.5.6 DWRUtil.addRows和DWRUtil.removeAll-Rows 50815.5.7 DWRUtil.toDescriptive-String方法 51515.6 小结 516第16章 搜索引擎综合实例:Web篇 51716.1 Web配置文件 51716.1.1 配置文件及其作用 51716.1.2 Spring配置文件 51816.1.3 DWR配置文件 51916.1.4 web.xml配置文件 52016.2 各种搜索相关Bean类 52116.2.1 产品SearchResult结果记录类 52216.2.2 产品SearchResults结果集合类 52416.2.3 产品SearchRequest检索请求类 52616.3 数据库访问SearchResultDAO类实现 52716.3.1 数码库访问类接口定义 52716.3.2 数码库访问类实现 52816.4 Lucene索引检索SearchService类实现 53016.4.1 索引检索类接口定义 53016.4.2 索引检索类实现 53116.5 前台Web页面设计 53616.5.1 数码垂直搜索主页面main.jsp 53616.5.2 数码搜索手机产品图片的显示 54216.5.3 手机产品详细信息页面detail.jsp 54316.6 实例中的问题与功能扩展 54616.7 小结 548附录 Lucene 2.4更新内容 549F1 IndexWriter的构造函数 549F2 IndexWriter的init方法 550F3 IndexWriter中的flush、commit和close 552F4 Lucene 2.4中的Segment 553F5 IndexCommit和IndexDeletion-Policy 555F6 IndexWriter中的add-Document 558F7 DocumentsWriter类的add-Document方法 559F8 DocumentsWriter的索引链 562
正在读取……
这里是其它用户补充的资源():
暂无补充资源
使用 BBCODE()
类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
勿催片。请相信驴友们对分享是富有激情的,如果确有更新版本,您一定能搜索到。
请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
如果您发现自己的评论不见了,请参考以上4条。
刚收藏了本资源的用户
他们也收藏了
上海隐志网络科技有限公司
打个分吧:
留点口水(可选):

我要回帖

更多关于 javaweb登录界面代码 的文章

 

随机推荐