OmniFind Enterprise Edition Web 服务通过 SOAP 协议提供的一种标准化方法提供对产品联邦搜索功能的访问。尽管可以使用 Java SIAPI 实现基于 J2EE 和 Java 的搜索应用程序,或把 OmniFind 搜索功能集成在基于这些技术的定制应用程序中,但是也可以使用 OmniFind Web 服务开发基于支持 Web 服务标准的其他技术的搜索应用程序。图 1 显示 OmniFind 提供的应用程序接口:
图 1. OmniFind Enterprise Edition 应用程序接口
“WSDL for Web services” 页面列出 OmniFind Web service WSDL 提供的一些函数(见 参考资料 中的链接)。最重要的函数是 search 函数,它是本文包含的示例代码的基础(见 下载)。
search 函数通过输入参数接收查询信息,返回包含搜索结果的结果集。用来指定搜索查询信息的 WSDL 类型称为 SearchRequest。不但必须使用它指定搜索查询字符串,还使用它配置查询本身(即查询语言、启用拼写纠正和集合 ID 等等)。
search 函数返回的 WSDL 类型称为 SearchResponse。它包含满足搜索查询的结果和其他搜索信息(比如建议的拼写纠正和同义词等等)。
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。(更多信息见 参考资料)。
下面一节描述开发一个使用 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 类的 firstRequestedResult 和 numRequestedResults 字段,从而只获得第一页结果。如果希望获取满足查询条件的所有结果,就不要设置这些属性。
清单 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 属性所指定的数量的结果。要想获得另一页结果,必须正确地设置 firstRequestedResult 和 numRequestedResults 字段,然后再次调用 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.zip | 2KB | HTTP |
学习
-
OmniFind Enterprise Edition 页面:寻找关于 IBM OmniFind Enterprise Edition 的更多信息。
-
OmniFind Enterprise Edition Information Center:查看、浏览和搜索关于 OmniFind Enterprise Edition 的在线信息。在 Information Center 中研究以下主题:
- Developing search applications
- Web services for enterprise search
- WSDL for Web services
- Setting query properties
-
“C# Tutorial”(C# Station,2008-2009 年):学习 C# 编程语言的基本知识。
- developerWorks Information Management 专区:学习关于 Information Management 的更多知识。在这里可以找到技术文档、how-to 文章、培训、下载、产品信息等等。
-
随时关注 developerWorks 技术活动 和 网络广播。
-
在 技术书店 浏览关于这些主题和其他技术主题的图书。
获得产品和技术
-
SharpDevelop:从 ic#code 网站下载 SharpDevelop,这是一种用于在 Microsoft .NET 平台上开发 C#、VB.NET 和 Boo 项目的免费的开放源码 IDE。
- 使用可直接从 developerWorks 下载的 IBM 试用软件 构建您的下一个开发项目。
讨论
- 参与论坛讨论。
- 参与 developerWorks blogs 并加入 developerWorks 社区。
