使ってみよう! Windows Live SDK/API

第1回 Live Search API

この記事を読むのに必要な時間:およそ 4 分

Webサイトの検索

さっそく,Webサイトを検索するコードを書いてみます。はじめにサービス参照により作られた名前空間をインポートしておきます。

Imports LiveSearchSample.ServiceReference

Webサービスに要求する内容を書いていきます。まず,検索対象や取得項目を設定するSourceRequestオブジェクトを生成します。

Dim sourceRequest = New SourceRequest With { _
    .Source = SourceType.Web, _
    .Offset = 0, _
    .Count = 10, _
    .ResultFields = ResultFieldMask.Title Or _
                    ResultFieldMask.Description Or _
                    ResultFieldMask.Url}
Source
検索対象を指定します。SourceType.Webの場合Webサイトを検索します。
Offset,Count
取得する結果件数(Count)とその開始位置(Offset)です。Offsetは0,Countは10が規定値になります。Offsetは最大1,000まで,Countは最大50※4まで指定可能です。
ResultFields
取得する項目を指定します。複数指定する場合はOr演算子を使います。上記ではタイトル・説明・URLを指定しています。

全般的な設定についてSearchRequestオブジェクトを生成します。

Dim searchRequest = New SearchRequest With { _
    .AppID = "取得したApplication ID", _
    .Query = "技術評論社", _
    .CultureInfo = "ja-JP", _
    .Requests = New SourceRequest() {sourceRequest}}
AppID
取得したApplication IDを指定します。
Query
検索する文字列を指定します。Live Searchの検索オプションで使用する検索キーワードも指定可能です。
CultureInfo
言語と地域の指定です。日本語・日本の場合は「ja-JP」になります。
Requests
SourceRequestオブジェクトの配列を指定します。

以上でWebサービスへのリクエスト内容の作成は完了です。Webサービスを呼び出すクラスのインスタンスを作成し,結果を取得してみます。Searchメソッドを呼び出すことで検索結果が得られます。その戻り値はSearchResponseオブジェクトです。

Dim service = New MSNSearchPortTypeClient
Dim searchResponse = service.Search(searchRequest)
Dim sourceResponse = searchResponse.Responses.Single

ResponsesプロパティにSourceResponseオブジェクトが配列として格納されています。今回の場合は結果が1つ格納されていることが予測されるため,Singleメソッドを用いてSourceResponseを取得しています。

結果をコンソールに出力してみましょう。Totalプロパティに検索リクエストに該当する件数の概算値が入っています。For Eachステートメントを使用してResultsプロパティの内容を表示しています。必ずしも,リクエストした件数分取得できる・指定した項目に値が入っているというわけではありませんので注意してください。

For Each result In sourceResponse.Results
    If result.Title IsNot Nothing Then
        Console.WriteLine("Title: " & result.Title)
    End If
    If result.Description IsNot Nothing Then
        Console.WriteLine("Description: " & result.Description)
    End If
    If result.Url IsNot Nothing Then
        Console.WriteLine("URL: " & result.Url)
    End If
    Console.WriteLine(New String("-"c, 50))
Next

service.Close()

実行するとWebサイトの結果が表示されると思います。うまく動いたでしょうか? ここまでのコードをファイルにまとめました。Searchメソッドを呼び出したとき例外がスローされる可能性がありますのでTry Catchステートメントを使って例外処理をしています。

SampleModule1.vbのダウンロード
SampleModule1.vbファイル

複数のSourceRequestを指定した検索

Webサイトの検索のときにSearchRequest.Requestsプロパティは配列で指定しました。実はSourceRequest.SourceプロパティのSourceTypeが異なれば1度のリクエストで複数のSourceRequestオブジェクトを指定できます。次は複数のSourceRequestを指定して検索できるように変更を加えてみます。

複数指定できるよう,SourceRequest型の変数はListコレクションに変更します。このListに各SourceRequestオブジェクトを追加していきます。

Dim sourceRequests = New List(Of SourceRequest)

SourceType.Newsを指定すると,ニュース記事から検索します。最初の1件のタイトルとURLを取得してみます。

sourceRequests.Add(New SourceRequest With { _
    .Source = SourceType.News, _
    .Count = 1, _
    .ResultFields = ResultFieldMask.Title Or _
                    ResultFieldMask.Url})

Live Search APIでは検索文字列に指定した単語の修正候補を取得することもできます。修正候補があった場合,タイトル項目に格納されて返ってきます。

sourceRequests.Add(New SourceRequest With { _
    .Source = SourceType.Spelling, _
    .Count = 3, _
    .ResultFields = ResultFieldMask.Title})

SearchRequest.Requestsプロパティには,sourceRequestsをToArrayメソッドを使って配列化し指定します。

searchRequest.Requests = sourceRequests.ToArray

検索結果は,SearchResponse.Responsesに複数のSourceResponseオブジェクトが格納されて返ってくることが予測されます。各SourceResponseの内容を出力できるように変更します。

Dim searchResponse = service.Search(searchRequest)

For Each sourceResponse In searchResponse.Responses

    Console.WriteLine("Source: " & sourceResponse.Source.ToString)
    Console.WriteLine("Total: " & sourceResponse.Total)

    For Each result In sourceResponse.Results
        If result.Title IsNot Nothing Then
            Console.WriteLine("Title: " & result.Title)
        End If
        If result.Description IsNot Nothing Then
            Console.WriteLine("Description: " & result.Description)
        End If
        If result.Url IsNot Nothing Then
            Console.WriteLine("URL: " & result.Url)
        End If
        Console.WriteLine(New String("-"c, 50))
    Next
Next

以上のコードをファイルにまとめましたので参照してください。

SampleModule2.vbのダウンロード
SampleModule2.vbファイル

おわりに

いかがでしたでしょうか。検索リクエストに指定できるオプションは,実際のLive Searchと同様にまだたくさんあります。今回紹介したものは代表的なものでした。より詳細に検索結果を制御したい場合はAPIリファレンスを参照してみてください。

次回もLive Search APIを利用してアプリケーションを開発します。

※4
日本向けサービスはありませんが,検索対象が電話番号(SourceがSourceType .PhoneBook)の場合は25までです。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp