使用 Web 服务从 .NET 执行 OmniFind 搜索

使用 IBM OmniFind Enterprise Edition Web 服务从基于 Microsoft .NET 技术的应用程序执行搜索

在本文中,学习如何使用 IBM® OmniFind® Enterprise Edition Web 服务接口实现基本的 Microsoft® .NET 搜索应用程序。OmniFind Enterprise Edition 提供一个强大的 Java™ 应用程序编程接口,让开发人员可以把它的搜索功能集成在基于 J2EE 或 Java 的定制应用程序中。另外,OmniFind Enterprise Edition 还提供一个 Web 服务编程接口,通过这个接口,开发人员可以使用支持 Web 服务和 SOAP 标准的任何编程语言执行搜索。

Massimiliano Carra, 企业内容管理技术销售, WSO2 Inc

Massimiliano CarraMassimiliano Carra 是 IBM 的企业内容管理 IT 专家,主要关注 IBM FileNet P8 Platform and Discovery 解决方案。他在各种 IT 专业领域有超过 13 年的经验,从使用 J2EE 和 SOA 技术的系统集成到面向对象应用程序的解决方案设计。他还在 Linux 操作系统及开放源码产品和项目方面有 10 年的经验。他于 2005 年加入 IBM Software Group,担任 Information Management 方面的技术销售专家,直接负责为意大利中南部的客户提供技术服务。



2009 年 4 月 13 日

OmniFind Web 服务概述

OmniFind Enterprise Edition Web 服务通过 SOAP 协议提供的一种标准化方法提供对产品联邦搜索功能的访问。尽管可以使用 Java SIAPI 实现基于 J2EE 和 Java 的搜索应用程序,或把 OmniFind 搜索功能集成在基于这些技术的定制应用程序中,但是也可以使用 OmniFind Web 服务开发基于支持 Web 服务标准的其他技术的搜索应用程序。图 1 显示 OmniFind 提供的应用程序接口:

图 1. OmniFind Enterprise Edition 应用程序接口
OmniFind Enterprise Edition 应用程序接口

Web 服务公开的函数

“WSDL for Web services” 页面列出 OmniFind Web service WSDL 提供的一些函数(见 参考资料 中的链接)。最重要的函数是 search 函数,它是本文包含的示例代码的基础(见 下载)。

search 函数通过输入参数接收查询信息,返回包含搜索结果的结果集。用来指定搜索查询信息的 WSDL 类型称为 SearchRequest。不但必须使用它指定搜索查询字符串,还使用它配置查询本身(即查询语言、启用拼写纠正和集合 ID 等等)。

search 函数返回的 WSDL 类型称为 SearchResponse。它包含满足搜索查询的结果和其他搜索信息(比如建议的拼写纠正和同义词等等)。


入门

检验 Web 服务是否工作正常

OmniFind Web 服务部署为 ESSearchServer 应用程序的组成部分。因此,需要安装和运行 OmniFind Enterprise Edition。

要做的第一件事是,检查是否正确地安装了 OmniFind Web 服务,它是否工作正常。为此,可以在 Web 浏览器中通过以下 URL 访问 Web 服务端点:http://[your_search_server]/ESSearchServer/services/ofsearchBinding。

如果 Web 服务返回消息 “Hi there, this is a Web service!”,就说明它工作正常,可以继续执行下一步了。

设置开发环境

如果需要在 .NET 中开发、构建和测试 Web 服务,就需要设置一个开发环境。这需要一台安装了 Microsoft .NET 运行时环境和 Microsoft .NET SDK 的 Microsoft Windows® 工作站。这两种软件都可以从 Microsoft 网站下载。

编译 .NET 应用程序只需要 Microsoft .NET SDK。但是,如果希望简化代码的开发和调试,可能需要一个 IDE(集成开发环境)。市场上有几种 .NET IDE。如果由于许可证的问题无法使用 Microsoft IDE,可以使用 SharpDevelop,这是一种出色的开放源码 .NET IDE。(更多信息见 参考资料)。


开发简单的 .NET 搜索应用程序

下面一节描述开发一个使用 OmniFind Web 服务执行企业搜索的 .NET 应用程序的主要步骤。本文提供的源代码中也解释了这些步骤(见 下载)。

生成代理客户机

开发 OmniFind .NET 搜索应用程序的第一步是生成一个 .NET 代理客户机。可以使用 .NET SDK 提供的 wsdl.exe 工具完成这个任务。

必须从命令行执行 wsdl.exe,还需要通过参数提供 WSDL URL。还可以指定代理客户机的 .NET 目标语言(默认语言是 C#)。

从 DOS 命令行执行以下命令,就会生成一个 C# OmniFind Web 服务代理客户机:

wsdl.exe http://search_server/ESSearchServer/wsdl/com/ibm/es/ws6/server/search/ofsearch.wsdl

其中的 search_server 必须替换为安装 OmniFind Enterprise Search 应用程序的服务器的主机名。

创建和初始化搜索对象

对 OmniFind 执行搜索的代理客户机类称为 ofsearch。首先,需要创建这个类的实例并根据 Web 服务端点设置它:

清单 1. 创建和初始化搜索对象的示例代码
//Create and initialize the search object
ofsearch searchObj = new ofsearch();
searchObj.Url = “http:/search_server/ESSearchServer/services/ofsearchBinding";

创建查询请求

用于设置查询的 OmniFind Web 服务对象是 SearchRequest 类。它提供一组用于设置查询的方法和属性,后面会解释大多数方法和属性。

SearchRequest Web 服务类对应的 Java SIAPI 类型是 com.ibm.siapi.search.Query 接口。SearchRequest 类并没有提供 com.ibm.siapi.search.Query 接口的所有特性,但是可以通过 Java SIAPI Javadoc 文档了解关于 SearchRequest 类提供的方法和属性的更多信息。

注意:OmniFind 在以下位置提供 SIAPI Javadoc 文档:[ES_INSTALL_ROOT]/docs/api/siapi(其中的 ES_INSTALL_ROOT 是 OmniFind 安装目录)。

创建请求对象

接下来,创建一个对象实例,可以在其中设置所有查询参数。

清单 2. 创建请求对象的示例代码
//Create the request object
SearchRequest request = new SearchRequest();

设置查询参数

查询参数用来启用或禁用与查询相关的功能,比如拼写纠正、同义词展开等等。要想设置这些参数,可以使用 SearchRequest 类定义的相应字段。

清单 3. 启用拼写纠正的示例代码
//Enable spell corrections
request.spellCorrectionEnabled = true;

设置返回属性

可以决定在结果中是否返回属性类型。属性类型包括标题、日期等等。返回属性类型的完整列表见 Java SIAPI Javadoc 中对 com.ibm.siapi.search.Query 接口的 setReturnedAttribute 方法的说明。

必须使用 PredefinedAttribute 对象的数组在请求对象中设置关于启用返回属性的信息,数组的每个元素包含一个属性类型的配置。每个 PredefinedAttribute 对象包含两个值:一个与属性类型对应的数字值,以及一个指定是否返回此属性的布尔值。

Java SIAPI 定义了一组代表属性类型的静态变量。在 Java SIAPI Javadoc 中对 com.ibm.siapi.search.BaseQuery 接口的说明中,可以找到所有值的列表。

下面的示例代码设置在查询结果中返回的字段属性:

清单 4. 设置在查询结果中返回的字段属性的示例代码
//Enable the return of the field attribute (RETURN_RESULT_FIELDS)
PredefinedAttribute returnFields = new PredefinedAttribute ();
returnFields.attribute = -3;
returnFields.returned = true;

attributesList.Add(returnFields);

PredefinedAttribute[] predefinedAttributes;

predefinedAttributes =
    (PredefinedAttribute[])attributesList.ToArray( typeof (PredefinedAttribute) );

request.returnAttribute = predefinedAttributes;

设置排序参数

要想决定 OmniFind 返回的结果必须如何排序,就要设置排序参数。具体地说,可以使用它们设置结果排序所依据的键和地区、排序次序以及根据键排序之后应该返回的结果数量。关于排序键的更多信息,请参见 Java SIAPI Javadoc 中对 com.ibm.siapi.search.Query 类的 setSort 方法的说明。

要想在 .NET 应用程序中设置排序参数,可以使用 SearchRequest 类定义的排序属性。如果没有设置排序参数,结果会按照相关性排序。清单 5 中的代码通过设置排序属性,按照日期的降序获取所有查询结果:

清单 5. 按照日期次序获取结果的示例代码
//Set sort parameters

//set the sort key to SORT_KEY_DATE in order to retrieve the results ordered by date
request.sortKey = "date";

//set the sortOrder to SORT_ORDER_DESCENDING
request.sortOrder = -1;

/*
set the sortPoolSize property to SORT_ALL_RESULTS in order
to retrieve all the results ordered by the specified key
*/
request.sortPoolSize = 2147483647;

设置查询属性

可以通过设置查询属性控制查询处理。Information Center 中的 “Setting query properties” 页面列出了用来控制查询的属性(见 参考资料 中的链接)。清单 6 演示如何通过设置 HighlightingMode 属性在 OmniFind 返回的几个字段(文档标题、文档 URL 等等)中突出显示查询词:

清单 6. 在几个结果字段中突出显示搜索词的示例代码
//set query properties

//Create a Property objects array
Property[] queryProperties = new Property[1];

/*
Create the Property object containing the HighlightingMode property value
in order to obtain extended highlighting
*/
Property highlightingModeProp = new Property();
highlightingModeProp.name = "HighlightingMode";
highlightingModeProp.value = "ExtendedHighlighting";

//Put the highlightingMode property in the properties array
queryProperties[0]=highlightingModeProp;

//Set the properties field with the Property array
request.properties = queryProperties;

设置结果分页参数

如果希望实现查询结果的分页显示机制,就必须初始化 SearchRequest 类的 firstRequestedResultnumRequestedResults 字段,从而只获得第一页结果。如果希望获取满足查询条件的所有结果,就不要设置这些属性。

清单 7. 设置结果分页参数
//Set parameters to page the first search results
request.firstRequestedResult = firstResult;
request.numRequestedResults = resultPerPage;

设置查询字符串并启动搜索

启动查询之前要做的最后一件事是设置查询字符串。这需要使用 SearchRequest 类提供的 queryText 属性。

清单 8. 设置查询字符串
//set the query text
request.queryText = searchString;

启动搜索的方法是调用 ofseach.search() 方法,并把前面步骤中创建和初始化的 SearchRequest 实例传递给它。

清单 9. 执行搜索
//Perform the search to get the first n results
SearchResponse response = searchObj.search(request);

如果搜索应用程序实现了结果分页显示,那么 search 方法返回 numRequestedResults 属性所指定的数量的结果。要想获得另一页结果,必须正确地设置 firstRequestedResultnumRequestedResults 字段,然后再次调用 search 方法。

获取查询结果

正如前面提到的,ofsearch.search() 方法返回 SearchResponse 类的实例。它提供查询返回的条目和与搜索相关的所有其他信息。

本节讨论本文提供的示例应用程序实现的结果获取过程(见 下载)。

SearchResponse Web 服务类对应的 Java SIAPI 类型是 com.ibm.siapi.search.ResultSet 接口。可以通过 Java SIAPI Javadoc 文档了解关于 SearchResponse 类提供的方法和属性的更多信息。

获取建议的拼写纠正和同义词展开

如果在查询准备期间启用了拼写纠正,那么响应对象会提供 OmniFind 对查询词提出的建议。

SearchResponse.spellCorrections 属性包含 SpellCorrection 对象的数组,每个对象提供 OmniFind 建议要替换掉的词和建议的替换词。

如果 OmniFind 没有提议任何拼写纠正,spellCorrections 属性就是 null

同义词展开由包含在 SearchResponse.synonymExpansions 属性中的 SynonymExpansion 对象数组提供。

清单 10. 获取拼写纠正的示例代码
//Look for proposed spell corrections
SpellCorrection[] spellCorrections = response.spellCorrections;
if (spellCorrections != null){
    foreach (SpellCorrection currentSpellCorrection in spellCorrections){
        foreach (String suggestion in currentSpellCorrection.suggestions){
            Console.WriteLine ("Did you mean: " + suggestion);
        }
    }
}

获取关于搜索结果的信息

SearchResponse 对象提供关于搜索结果的一般性信息,比如 OmniFind 提供的结果数量、满足查询但超过结果池大小的结果的估计数量以及与搜索响应相关联的消息。

清单 11. 显示关于结果数量的信息
//Print general information about the search results
Console.WriteLine ("-----------------------------------");
Console.WriteLine ("Available results: " + response.availableNumberOfResults);
Console.WriteLine ("Estimated results: " + response.estimatedNumberOfResults);
Console.WriteLine ("-----------------------------------");

获取搜索结果

满足查询的结果包含在 SearchResponse 实例的 results 属性中。results 属性包含 Result 对象的数组,每个对象提供一个结果的所有属性。这些属性包括标准字段(比如标题、描述、日期、语言、URI 等);如果启用了结果字段属性,那么还包括结果类型特有的字段(例如,如果结果是数据库列,那么包括列值;如果源是 FileNet P8 或 IBM Content Manager 等内容管理存储库,那么包括元数据的值)。

下面的 C# 代码(清单 12)循环遍历 Result 实例并输出与结果相关的字段:

清单 12. 获取搜索结果的示例代码
//Show results properties
Result[] foundedResults = response.results;

if (foundedResults != null)
{
    foreach (Result result in foundedResults){
        //Increase the result counter
        resultCounter++;
        Console.WriteLine ("** Result # " + resultCounter + " **");

        NameValuePair[] fields = result.fields;

        foreach (NameValuePair field in fields){
            Console.WriteLine (field.name + ": " + field.value);
        }

        Console.WriteLine ("** End of Result **");
        Console.WriteLine (" ");
    }
}

结束语

通过使用 OmniFind Enterprise Edition Web 服务接口,可以把 OmniFind 提供的搜索功能集成在基于支持 Web 服务和 SOAP 标准的任何技术的环境中。按照本文提供的指导,可以马上开始开发 .NET 搜索应用程序并理解 OmniFind Web 服务的工作方式,从而用支持 Web 服务技术的其他语言实现搜索应用程序。


下载

描述名字大小
执行 OmniFind 搜索的示例 C# 代码OmniFindSearchSample.zip2KB

参考资料

学习

获得产品和技术

  • SharpDevelop:从 ic#code 网站下载 SharpDevelop,这是一种用于在 Microsoft .NET 平台上开发 C#、VB.NET 和 Boo 项目的免费的开放源码 IDE。
  • 使用可直接从 developerWorks 下载的 IBM 试用软件 构建您的下一个开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, SOA and web services
ArticleID=381374
ArticleTitle=使用 Web 服务从 .NET 执行 OmniFind 搜索
publish-date=04132009