しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Search のインデックスに文字列のコレクションを追加して検索を行ってみた

一気に Azure Search についてブログを書いていますが、一気に書きたくなるぐらいに面白いサービスがやってきたという気持ちです。なので、今回は検索インデックスに文字列のコレクションを追加してみます。

f:id:shiba-yan:20140822222713p:plain

検索インデックスに文字列のコレクションを追加することで、上の画像のようなはてなブックマークでのタグ検索が簡単に実現可能です。インデックスの作成時に WithStringCollectionField メソッドを使うことで、文字列コレクション型のフィールドを追加します。

var client = new IndexManagementClient(connection);

await client.CreateIndexAsync(new Index("items")
    .WithStringField("id", p => p.IsKey().IsRetrievable())
    .WithStringField("name", p => p.IsSearchable().IsRetrievable())
    .WithStringCollectionField("attributes", p => p.IsSearchable().IsRetrievable())
);

文字列のコレクションであっても IsSearchable メソッドを呼び出すことで検索対象に出来ます。

インデックスにデータを追加する場合でも、今までと同じように WithProperty メソッドを使ってコレクションをインデックスに追加します。

var client = new IndexManagementClient(connection);

var operations = new[]
{
    new IndexOperation(IndexOperationType.Upload, "id", "1")
        .WithProperty("name", "@kamebuchi")
        .WithProperty("attributes", new[] { "抱かれたい男", "Microsoft Azure", "アニメ好き" }),
    new IndexOperation(IndexOperationType.Upload, "id", "2")
        .WithProperty("name", "@statemachine")
        .WithProperty("attributes", new[] { "お義父さん", "変態マシーン", "Microsoft Azure" }),
    new IndexOperation(IndexOperationType.Upload, "id", "3")
        .WithProperty("name", "@daruyanagi")
        .WithProperty("attributes", new[] { "だるやなぎ", "アニメ好き", "ホモ" })
};

await client.PopulateAsync("items", operations);

インデックスへデータを追加するコードは今までと変わりません。それでは実際に検索を行うコードです。

var client = new IndexQueryClient(connection);

var result = await client.SearchAsync("items", new SearchQuery("\"アニメ\""));

foreach (var item in result.Body.Records)
{
    Console.WriteLine("{0} - {1},{2}", item.Score, item.Properties["name"], item.Properties["attributes"]);
}

検索対象のフィールドを指定しないので、全ての検索可能なフィールドに対してクエリを実行します。

実行結果は以下のようになりました。

f:id:shiba-yan:20140822222024p:plain

しっかりと attributes フィールドのコレクションに、アニメが含まれているデータが取得出来ました。

最初に例に挙げたはてなブックマークの検索機能ですが、Azure Search を使うことで同様の機能を簡単に実装できる感じがしますね。使えば使うほど GA が楽しみになるサービスです。