级别: 中级 Paul Hill (hillpa@au.ibm.com), 技术专家, IBM Chris Chilcott (chlcottc@au.ibm.com), 技术专家, IBM
2006 年 3 月 27 日 通过集成 Informix® 与 WebSphere® Information Integrator OmniFind 搜索技术 (OmniFind),获得更多的企业级搜索能力。为获得 WebSphere Information Integrator OmniFind Edition 提供的好处,这一方法也同样适用于其他关系数据库管理系统。
简介
关系数据库管理系统(Relational database management systems,RDBMS)适合于存储和检索结构化数据。SQL 提供了用于在结构化数据上定义和执行搜索的成熟机制,但对于不是强类型化的或不易索引的数据(例如,大块的文本数据和二进制数据),其执行能力就非常差。当今的 RDBMS 也用于存储非结构化数据和日益流行的半结构化 XML 数据。诸如 VARCHAR 和 CLOB 之类的数据类型允许您存储无格式 ASCII 文本,而 BLOB 数据类型允许存储复杂(专有)类型的数据,如 .pdf、.doc、.ppt、.rtf、.xml 等。对于这些类型的数据,SQL 不提供定义和执行搜索的机制。
过去,有些 RDBMS 试图通过在 RDBMS 代码中提供文本索引 '引擎' 来在一定程度上克服这些局限性。例如,Informix 数据库支持 Excalibur Text DataBlade™,该工具本质上是一个插入在 Informix 数据库中的文本索引和搜索引擎。
然而。不管 RDBMS 支持文本索引和搜索功能如何优秀,该活动仍然受特定 RDBMS 自身的数据范围的约束。对于企业中独立存在于数据库之外的大多数数据,RDBMS 无法索引和支持搜索功能。因此,RDBMS 文本索引/搜索从不支持发现各种组织中信息片段的问题的企业方法。本文使用 WebSphere Information Integrator OmniFind Edition 和 DataListener 展示如何将存储在 RDBMS 中的结构化和非结构化数据 “推向” WebSphere Information Integrator OmniFind Edition。虽然本文内容适用于任何环境,但尤其适用的地方是,RDBMS 已经用于存储非结构化内容,需要把这些内容作为企业文本索引/搜索功能的一部分。
本文通过一个例子来使用 Informix 数据库,在该数据库的表中以 BLOB 数据类型存储了非结构化的数据。您将学会如何访问文档以及将它们推向 WebSphere Information Integrator OmniFind Edition,随后进行了解释和索引。经过一些小的修改后(主要是针对连接字符串),此代码适合于任何 RDBMS。
何为企业搜索?
当今的组织在整个 IT 环境的多个地方存储信息。数据库、邮件服务器、本地文件系统、项目存储库、内容管理系统、Web 内容管理系统和应用服务器(如 CRM)全都保存着部分关键信息,组织越来越需要同时使用工具来搜索所有这些不同的环境。当实际数据本身以多种格式存储,并且采用不同的组织方式和结构时,复杂度进一步加大。数据可以以结构化形式(如数据库)存储,以非结构化形式(如文件系统上的文件)存储,或者以半结构化形式(如 XML)存储。
快速查找信息这一用户期望日益增加,迫切需要 Web 搜索技术能够在数秒钟内通过流行的搜索引擎(如 Google 或 Yahoo)查找数百万 Web 页中的单词或短语。
企业搜索(Enterprise Search)技术为用户提供了查找组织中任何地方相关信息的能力。它超过 Internet 搜索的单个单词匹配能力。这种例子包括使用语义搜索(搜索 “fast car” 可能匹配包含 “Porsche” 的记录)和参量搜索(查找发生在 1990 和 1991 之间的所有引用)。
在使用企业搜索技术之前,许多组织试图采用一种针对信息存储和搜索的更结构化的方法。关系数据库和最近的对象关系或通用数据库是这些组织的一般存储库。数据结构是格式化的,存储机制受限于各种技术的能力。这限制了管理内容(比如电子邮件或文档)的容量。搜索也局限于数据库中可用的功能,通常是 ANSI SQL 标准中的通配符搜索。Informix 利用其 DataBlade 技术提供了更复杂的可扩展技术,允许用户开发自己的搜索机制,比如正则表达式(Regular Expression)搜索或 Excalibur Text 搜索。
在搜索仅仅局限于单个数据库存储库的环境中,这些机制提供了能够胜任的解决方案。但是,当需要跨整个企业进行搜索时,Informix 数据库变成了另一种数据源,需要从 WebSphere Information Integrator OmniFind 环境中进行访问。
使用 WebSphere Information Integator OmniFind Enterprise Edition Search 与已有的 Informix
企业搜索引擎通常遵循类似的方法:它们缓慢扫描数据,将关键数据解析成某种通用记录格式,索引这些记录,然后提供搜索应用程序和用户界面以访问该索引。
WebSphere Information Integrator OmniFind Edition 实现了爬行器(crawler)来本地支持各种目标(Web、NNTP、文件系统、IBM Lotus® Domino®、Microsoft® Exchange、IBM Workplace® Web Content Management™),以及使用连接器与 Information Integrator(DB2®、Oracle®、Informix 等)或 Information Integrator Content Edition(FileNet、Hummingbird 等)的爬行器。请参阅受支持数据源的 完整列表。
配置 Informix 的爬行器可以通过使用 DB2 Control Center 定义 nickname 表来完成,然后使用 WebSphere Information Integrator OmniFind Edition 管理的向导来添加 DB2 数据源。
这为将 Informix 表添加到 WebSphere Information Integrator OmniFind Edition 提供了一种通用的解决方案;但是,针对配置复杂性应有四种显而易见的考虑:
- Information Integrator(Large Object Locator、SLOB、DataLinks)所支持的、可以存储内容的基本类型以外的数据类型支持。
- 内容类型的粒度是表级别的而不是行级别的。可以在相同表中以多种格式(Microsoft Word、Microsoft PowerPoint、Adobe Acrobat 等)存储的文档将难于解析,因为 mime 类型只能作为一个整体赋予某列。
- 连接器许可证需要解析每个数据库,软件可能需要在很多远程服务器上安装和维护,以访问必需的数据库。如果您有广泛的 Informix 技能,并且正准备使用 WebSphere Information Integrator OmniFind Edition,采用 DB2 技能来配置和管理 Information Integrator 可能是一种昂贵的开发。
- 内部爬行是一种收集和扫描活动,旨在针对一些不频繁的活动执行,因此目标系统不会过分地受到活动的影响。这种特征创造了一种每夜或每周爬行目标数据库的行为,这导致影响报告和维护窗口,用户很可能无法找到当前信息。
- 有时,有一个可以定制(编程)以使用特定环境的实用工具是非常有用的。
DataListener:推,而不是拉
爬行器是一种拉 类型的接口——它们连接到目标系统,扫描更改,然后将数据拉回 WebSphere Information Integrator OmniFind Edition,以用于解析。
DataListener 提供了到 WebSphere Information Integrator OmniFind Edition 的接口,内容可以从目标系统推向 WebSphere Information Integrator OmniFind Edition,供解析器使用。这允许只有源系统(在本例中是 Informix)确定的相关内容才被推出,以用于搜索。当使用数据库作为源时,数据可以使用触发器在每事务的基础上被推出(可能需要一个小的 bladelet 实现),或者可以在非尖峰时期进行调度。
在 Informix 提供文档或内容存储库的环境中,数据可以根据需要推向 WebSphere Information Integrator OmniFind Edition(通过触发器或批处理过程)。解析器将在收到后解析内容,并可调度索引器来每隔几分钟刷新一次(由于上次索引被重新构建,索引刷新只构建更改内容的列表,而不是重新构建整个索引)。
DataListener 接口由 Java™ API 组成,具备适当基本技能的程序员应该可以修改例子以适应自己的需要。考虑技能和项目资源时,必需的 Java 技能将类似于定制 WebSphere Information Integrator OmniFind Edition 搜索接口的需求。这最大限度减少了完成项目的技能需求,无需另外理解并配置 WebSphere Information Integrator 环境。
使用 Informix 和 DataListener 的工作示例
要完成一个基于 Java 的实用工具程序,将数据从 Informix 移至 DataListener,需要 5 个关键步骤:
- 配置 Informix 的 JDBC™ 环境,并连接到源数据库
- 确定从 Informix 选择的行和列,并执行一条 SQL Select 语句,以检索数据
- 为 WebSphere Information Integrator OmniFind Edition 配置 DataListener 环境
- 将数据推向 WebSphere Information Integrator OmniFind Edition
- 将数据放在一起,并测试结果!
本文给出了一个小的 Java 实用工具程序,它提供了一个具有上述步骤的工作示例,并有一个 XML 配置文件,用于简化到 WebSphere Information Integrator OmniFind Edition 和 Informix 的连接;建立 SELECT 语句;以及推向 WebSphere Information Integrator OmniFind Edition 所必需的列。该程序叫做 ids2omf,贯穿本文都会引用它。
本文撰写和例子测试基于以下软件产品和版本:
-Informix Dynamic Server V10.0UC2
-WebSphere Information Integrator OmniFind Edition V8.2.2
-WebSphere Application Server V5.1.1
-JDK 1.4.2
图 1. 架构的图形化表示
第 1 步:到 Informix 数据库的 JDBC 连接
开发到 Informix 的连接所需的 Java 库是 Informix ClientSDK 软件包。如果您的数据库在不同的主机上,并且您的本地开发环境是不同的平台(UNIX® 数据库服务器,Linux® 开发环境),请确保根据运行 Java 代码的平台来下载 ClientSDK。
将合适的库目录添加到 ClientSDK 的 CLASSPATH 环境变量(它将包含 ifxjdbc.jar、ifxjdbcx.jar、ifxlang.jar 等等)。
数据服务器将只接受使用 TCP 接口的 JDBC 连接。这可能需要针对您的环境进行配置,并将需要编辑 /etc/hosts、onconfig 和 sqlhosts 文件。有关更多信息,请参阅 Informix Infocenter documentation。
要创建到 Informix 的 JDBC 连接,需要一个 URL 来确定目标数据库,并提供合适的用户凭据;例如:
jdbc:informix-sqli://10.0.0.102:40000/stores_demo:INFORMIXSERVER=demo_on_tcp;user=
informix;password=informix |
使用 JDBC 连接到 Informix 的 Java 代码示例:
...
static Connection informixConnection = null;
...
try {
Class.forName("com.informix.jdbc.IfxDriver");
} catch (Exception e) {
System.out.println("FAILED: failed to load Informix JDBC driver.");
}
try {
informixConnection = DriverManager.getConnection(jdbcURL);
} catch (SQLException e) {
System.out.println("FAILED: failed to connect!");
System.out.println(jdbcURL);
System.out.println(e.getMessage());
e.printStackTrace();
}
try {
informixConnection.setReadOnly(true);
} catch (SQLException e) {
e.printStackTrace();
}
|
在完成程序前需要以下代码来关闭连接:
try {
informixConnection.close();
} catch (SQLException e) {
System.out.println("FAILED: failed to close the connection!");
}
System.out.println("Disconnect from source database.");
|
在上述例子中,一旦连接成功,活动连接将被保存在 “informixConnection” 变量中。
第 2 步:确定从 Informix 选择的行和列(Select)
当将数据推向 WebSphere Information Integrator OmniFind Edition 时,需要几部分信息。这包括可搜索的实际内容和几部分元数据(包括惟一资源标识符(URI)),以便惟一地识别稍后检索的行。该 URI 通常需要表中一个键记录值,比如 ID 列。如果被推的数据不是普通文本数据(如以 blob 类型存储的 Acrobat PDF 文件),则需要收集足够的数据来建立 MIME 类型,以便解析器正确执行。
使用 STORES_DEMO 数据库中的 CATALOG 表作为例子,我们可能对搜索目录描述(cat_descr 栏)感兴趣。为了惟一地标识每一行,我们将需要目录 ID 号(catalog_num)。
select 语句类似如下:
SELECT catalog_num, cat_descr
FROM catalog
执行查询的 Java 代码为:
...
// Execute the SELECT statement
stmt = informixConnection.createStatement();
ResultSet queryResults = stmt.executeQuery("SELECT catalog_num,cat_descr FROM catalog;");
// Get the result set
ResultSetMetaData queryResultsMetaData = queryResults.getMetaData();
int numOfCols = queryResultsMetaData.getColumnCount();
// For each row in the result set...
while (queryResults.next()) {
totalSelected = totalSelected + 1;
// Build a URI for the row... table,id_column,id
uri = "informix://stores_demo/catalog/catalog_num/"+ queryResults.getString(1);
content_type = "text/plain";
// Grab the content which is in the cat_descr column
content = queryResults.getString("cat_descr").getBytes();
// Push the result to the DataListener and keep count of successes
...
} catch (Exception e) {
e.printStackTrace();
}
...
|
上述例子为基本文本数据提供了一个牢固的起点。在本文附带的 ids2omf.java 文件中, 编码反映了需要检查返回的数据类型(BLOB)并根据数据库记录建立正确的 MIME 类型。
第 3 步:为 WebSphere Information Integrator OmniFind Edition 配置 DataListener 环境(Configure)
当 WebSphere Information Integrator OmniFind Edition 启动时,DataListener 也默认启动。但是,如果没有在 WebSphere Information Integrator OmniFind Edition 环境中定义用户并让用户凭据与集合中保持一致,Listener 将无法接受连接。
DataListener 配置可以在 System: DataListener (edit) 菜单中找到。该用户 ID 的作用范围仅限于到 WebSphere Information Integrator OmniFind Edition 中的 DataListener 的连接。
注意:在该菜单中使用了 “Collection Name”;但是实际上,“Collection_ID” 对于 DataListener 客户端代码正确操作是必需的。
图 2. 配置 DataListener 屏幕
检查 DataListener 的监视菜单显示等待处理的请求(队列),而不是已经处理的请求。当检查您的代码是否工作时(当我们开始测试时),该屏幕没有提供大量有用的信息;但是,这是值得检查的,可以确保 Listener 正在运行。
图 3. DataListener 监视菜单
第 4 步:开发合适的代码来连接 DataListener
实际的推操作是一个两步过程。首先,元数据记录需要被填充,第二步,元数据记录和内容被真正推向 Listener。注意,实际内容被处理两次,一次在元数据记录中,一次在实际的推调用中。
大多数的元数据字段不是必需的;但是,如果您打算推非文本数据(比如 PDF 文件或 Word 文档),内容类型是必需的。如果正确的内容类型未通过,解析器将出现问题,通常会拒绝该文档(在我们的例子中,Stellant 解析器未能成功地建立正确的文档类型)。通过基于 Web 的 WebSphere Information Integrator OmniFind Edition Administration 接口检查日志文件,确定您的内容是被解析器拒绝还是忽略。
到 Listener 的连接不是持久连接;因此,不必针对 “连接,在完成所有事情前循环,断开连接” 进行编码。
元数据对象编码
...
// Build a default metadata object
DataSourceMetadata DSMetaData = DLDataPusher.createDataSourceMetadata(
"informix", // Datasource
"ids2omf", // Client application identifier
"informix", // Datasource name
0, // score (unused)
new Date(), // Date
"", // Language
", // Security access tokens
"text/plain", // Content type of content (mime type)
"", // Character set
content ); // Actual content
// call the push method
try {
DLResponse dlRes = DLDataPusher.pushData(hostname, port, clientID,
passwd, uri, collectionID, DSMetaData, content);
// check the result
if (dlRes != null)
if (dlRes.getCodeName() == "SUCCESS")
recordsPushed = recordsPushed + 1;
else {
System.out.println("Problem pushing to OmniFind: URI:"+ uri + "Problem:"
+ dlRes.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
...
|
Datasource 的 Client application identifier 和 datasource name 字段可以用您的环境中的任何信息来填充。这些值对于 WebSphere Information Integrator OmniFind Edition 正常工作不是必需的。
第 5 步:将所有内容放在一起
本文附带的 ids2omf.java 文件实现了本文所描述的功能。
要使代码更灵活,所做的其他工作是读取和解析一个 XML 参数文件,该文件定义 Informix 连接参数;SELECT 语句和关键列;以及 WebSphere Information Integrator OmniFind Edition 参数。
要编译该代码,以下 JAR 文件必须在您的 CLASSPATH 环境变量中可以访问:
siapi.jar、es.dl.client.jar、es.dl.server.jar、esapi.jar、ifxjdbc.jar、es.oss.jar、ifxtools.jar、ifxjdbcx.jar、ifxlang.jar、ifxlsupp.jar、ifxsqlj.jar
运行示例代码
esadmin@linux:~/ids2omf> cat set_classpath.sh
export CLASSPATH=/opt/IBM/es/lib/siapi.jar:/opt/IBM/es/lib/es.dl.client.jar:
/opt/IBM/es/lib/es.dl.server.jar:/opt/IBM/es/lib/esapi.jar:/opt/IBM/es/lib/es.oss.jar:
/opt/IBM/informix/jdbc/lib/ifxjdbc.jar:/opt/IBM/informix/jdbc/lib/ifxtools.jar:
/opt/IBM/informix/jdbc/lib/ifxjdbcx.jar:/opt/IBM/informix/jdbc/lib/ifxlang.jar:
/opt/IBM/informix/jdbc/lib/ifxlsupp.jar:/opt/IBM/informix/jdbc/lib/ifxsqlj.jar:.
esadmin@linux:~/ids2omf> . ./set_classpath.sh
esadmin@linux:~/ids2omf> javac ids2omf.java
esadmin@linux:~/ids2omf> java -cp .:$CLASSPATH ids2omf sources.xml
-------------------------------------------------------------------------
Starting Informix to OmniFind utility
-------------------------------------------------------------------------
Input Parameter file:sources.xml
Informix URL: jdbc:informix-sqli://10.0.0.106:40000/stores_demo:
INFORMIXSERVER=demo_on_tcp;user=informix;password=informix
OmniFind Target:10.0.0.106:6668:test:test:col_33762
Source selections in parameter file: 1
Connected to source database.
-------------------------------------------------------------------------
Tables: cust_calls
Where_clause: ""
Key column:customer_num
Data Column: call_descr
Data Type Column: "text/plain"
Push complete: Records selected:7, Records pushed:7
Disconnect from source database.
-------------------------------------------------------------------------
esadmin@linux:~/ids2omf>
|
不推荐的 DataListener 方法
DataListener 接口在 WebSphere Information Integrator OmniFind Edition 的 Version 8.3 中已经不再推荐使用,取而代之的是一种更新型的接口。本文中使用的 Java 例子仍然如 Version 8.3 中所述的那样运行;但是,在未来版本中,应该使用 Search 和 Index API 调用。
有关更多信息,请参阅 Programming Guide and API Reference V8.3 的第 4 章。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample Java class file for this article | ids2omf.java | 13KB | HTTP |
|---|
| Sample XML file for this article | sources.xml | 2KB | HTTP |
|---|
参考资料 学习
获得产品和技术
-
利用 IBM
试用版软件 构建您的下一个开发项目,这些软件可从 developerWorks 直接下载。
作者简介  | |  | 在为 IBM 工作之前,Paul 是 Informix 的一位售前工程师,专攻 DataBlade 技术的实现和扩展数据类型的使用(尤其是空间数据)。在 IBM 的过去 4 年中,Paul 拓宽了关注面,包括其他信息管理主题,比如企业级搜索和内容管理技术,以及将它们整合到企业中。 |
 | |  | Chris 在 Informix 和 IBM Information Management 售前领域已经工作了超过 10 年。他亲身体验到许多站点挣扎在发现和分析企业级信息的问题中。 |
对本文的评价
|