目次


Web サービスを利用した .NET からの OmniFind 検索の実行

IBM OmniFind Enterprise Edition の Web サービスを利用して、Microsoft .NET テクノロジー・ベースのアプリケーションから検索を実行する

Comments

OmniFind の Web サービスの概要

OmniFind® Enterprise Edition の Web サービスを利用すると、SOAP プロトコルによって提供される標準化された方法で、同製品の統合検索機能にアクセスすることができます。Java™ SIAPI を使用すると、J2EE および Java ベースの検索アプリケーションを実現したり、これらのテクノロジー・ベースのカスタム・アプリケーションに OmniFind の検索機能を組み込んだりすることができます。一方 OmniFind の Web サービスは、Web サービス標準をサポートするその他のテクノロジー・ベースの検索アプリケーションを開発する際に便利です。図 1 に、OmniFind のアプリケーション・インターフェースを示します。

図1. OmniFind Enterprise Edition のアプリケーション・インターフェース
OmniFind のアプリケーション・インターフェースを示しています。
OmniFind のアプリケーション・インターフェースを示しています。

Web サービスで提供される機能

OmniFind の Web サービス WSDL には、『WSDL for Web services』ページにリストされているような、いくつかの関数があります (リンクについては『参考文献』を参照)。最も関連性の高い関数は search 関数です。この関数は、この記事に含まれるサンプル・コードのベースとして使用されています (『ダウンロード』を参照)。

search 関数はクエリー情報を入力として使用して、検索結果を含む結果セットを返します。検索対象となるクエリー情報の指定に使用する WSDL 型は SearchRequest と呼ばれます。SearchRequest は、検索クエリー文字列の指定だけでなく、クエリー自体 (つまり、クエリー言語、スペル修正の有効化、コレクション ID など) の設定にも使用する必要があります。

search 関数によって返される WSDL 型は SearchResponse と呼ばれます。SearchResponse には、検索クエリーと一致するアイテムと、その他の検索情報 (スペル修正候補、類義語など) が含まれます。

はじめに

Web サービスが機能することを確認する

OmniFind の Web サービスは、ESSearchServer アプリケーションの一部として導入されます。したがって、インストールした OmniFind Enterprise Edition が稼働している必要があります。

まず最初に、OmniFind の Web サービスがインストールされており、正しく機能していることを確認します。これを行うには、以下の URL で Web ブラウザーから Web サービス・エンドポイントにアクセスします。

http://[your_search_server]/ESSearchServer/services/ofsearchBinding

Web サービスから「こんにちは。これは Web サービスです! (Hi there, this is a Web service!)」というメッセージが返されたら、正しく機能していることになり、次の手順に進むことができます。

開発環境を設定する

.NET から Web サービスの開発、構築、テストを行う場合は、開発環境を設定する必要があります。それには、Microsoft® .NET ランタイム環境と Microsoft .NET SDK がインストールされた Microsoft Windows® ワークステーションが必要です。これらはどちらも Microsoft の Web サイトからダウンロードできます。

このドキュメントに示すような .NET アプリケーションのコンパイルに必要なのは Microsoft .NET SDK のみです。ただし、コードの開発とデバッグを簡単にしたい場合は、おそらく IDE (統合開発環境) が必要となります。市販されている .NET IDE もいくつかありますが、ライセンスの問題から Microsoft IDE を使用できない場合は、優良なオープン・ソース .NET IDE である SharpDevelop を利用すると良いでしょう (詳細については『参考文献』を参照)。

単純な .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 エンタープライズ・サーチ・アプリケーションのインストール先となるサーバーのホスト名に置き換える必要があります。

検索オブジェクトを作成および初期化する

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 インターフェースです。com.ibm.siapi.search.Query インターフェースの実装のすべてが SearchRequest クラスによって提供されるわけではありませんが、Java SIAPI の Javadoc マニュアルを参照すると、SearchRequest クラスのメソッドとプロパティーに関する詳細情報を得ることができます。

注: SIAPI の Javadoc マニュアルは OmniFind に付属しており、以下の場所にあります。[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 オブジェクトの配列を使用して要求オブジェクト内に設定する必要があります。この配列の各要素に 1 つの属性型の設定が格納されます。各 PredefinedAttribute オブジェクトは、2 つの値を使用して設定されます。その 1 つは属性型に対応する数値で、もう 1 つは属性の戻りが有効か否かを指定するブール値です。

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;

クエリー・プロパティーを設定する

クエリー・プロパティーを設定すると、クエリー処理を制御することができます。クエリーの制御に使用可能なプロパティーは、インフォメーション・センターの『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 インターフェースです。SearchResponse クラスのメソッドおよびプロパティーの詳細については、Java SIAPI の Javadoc マニュアルを参照してください。

スペル修正候補と類義語拡張を取得する

(訳者注:日本語環境では、スペル修正機能は利用できません)

クエリーの作成時にスペル修正機能を有効にすると、response オブジェクトによって、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 サービスのしくみを理解して、この標準テクノロジーをサポートする各種言語でアプリケーションを実装することができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management, SOA and web services
ArticleID=422811
ArticleTitle=Web サービスを利用した .NET からの OmniFind 検索の実行
publish-date=02052009