快速业务通道

使用Java开源工具建立一个灵活的搜索引擎 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
act 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));     return doc;   }   return null; }

那么如何选择合适的 Strategy 来处理文件呢?UNIX 系统下的 file(1) 工具提供了从 magicnumber 获取文件类型的功能,我们可以使用 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,完成对结果集索引的工作。

使用Java开源工具建立一个灵活的搜索引擎(5)

时间:2011-01-26 IBM 仇寅

收集索引

完成对资源的索引之后,还需要让索引为搜索模块所用。前面我们已经说过这里介绍的框架主要用于小型应用,考虑到复杂性,我们采取简单地将分布在各个机器上的索引汇总到一个地方的策略。

汇总索引的传输方式可以有很多方案,比如使用 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(f

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号