Search:サービスとして新しいSearchのプレビューを発表
新しいAzure Searchサービスのプレビューを発表することできてうれしく思います。Azure Searchにより、開発者はWebやモバイルアプリケーションに素晴らしい検索機能を追加することができます。
Azure Searchは、実世界の検索サービスの管理、チューニング、スケール調整に伴う典型的な複雑さに対応することなく、検索機能を構築するために必要なすべての機能を開発者に提供します。これは、エンタープライズクラスのSLAが付いた完全に管理されたサービスとして提供されます。今回サービスの無償層もリリースしているので、無償でAzure上の小規模なソリューションに使用することができます。
Searchサービスのプロビジョニング
まずは、新しい検索サービスを作成してみましょう。Azureプレビューポータルで(http://portal.azure.com)、Azureギャラリーに移動し、Data storage, cache + backupカテゴリを選択し、Azure Searchギャラリー項目を確認してください。
“Search”サービスアイコンを見つけたら、Createを選択してサービスのインスタンスを作成してください。
2つの価格層オプションから選択できます。標準層は検索サービスに対して専用の容量が提供され、無償層は共有環境ですべてのAzureサブスクリプションで無償の小さい検索サービスを取得することができます。標準層ではスケールの増減を簡単に行うことができ、アプリケーションに対して検索パフォーマンスが予測可能になるよう保証される専用の容量が提供されます。また、数千万ものドキュメントを多くのインデックスでインデックス化する機能もサポートしています。無償層では、1万ドキュメント、最大3つのインデックスに限定され、専用容量の保証がありません。しかし完全に無償で、Azure Searchのすべての機能を試すには素晴らしい方法です。
Azure Searchサービスの管理
Searchサービスが準備できれば、ポータル内のSearchブレードにたどり着くので、サービスを管理したり、使用データを確認したり、サービスのパフォーマンスが調整できるようになります。
上記のScaleタイルをクリックすると、私の検索サービスに割り当てられたリソース数の詳細が表示されます。
もし標準の検索サービスを作成すると、これを使用して私のサービスに割り当てられたレプリカ数を増加させ、1秒当たりの検索数の増加(または可用性の向上)および私の検索サービス内でより多くのドキュメントをサポートするためにパーティション数の増加を行うことが可能になります。
検索インデックスの作成
検索サービスが作成されたので、検索されるドキュメント(データ)を確保する検索インデックスを作成する必要があります。開始するには、Azureポータルから2つの情報、私のAzure SearchサービスにアクセスするためのサービスURL(Propertiesタイル経由のアクセス)とサービスの認証を行う管理キー(Keysタイル経由のアクセス)が必要です。
この検索サービスURLと管理キーを使用すると、インデックスの作成や、今後のデータアップロード、また検索の要求を行うために検索サービスAPIが使用できるようになります。このキーを使用して、APIに対してHTTPリクエストを送信するので、以下のように.NET HttpClientオブジェクトを設定します。
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("api-key", "19F1BACDCD154F4D3918504CBF24CA1F");
まず検索インデックスを作成します。今回データセットにある連絡先を検索するために使用できるインデックスが欲しいので、名前やタグの検索フィールドが必要になります。また最終連絡日(後でソートやフィルタに使用するため)と、これも後でフィルタに使えるように緯度経度での住所も追跡したいと思います。簡単にするために、JSONにオブジェクトをシリアル化するのにJSON.NETを使用します(これを行うには、VSプロジェクトにNuGetパッケージを追加します)。
var index = new
{
name = "contacts",
fields = new[]
{
new { name = "id", type = "Edm.String", key = true },
new { name = "fullname", type = "Edm.String", key = false },
new { name = "tags", type = "Collection(Edm.String)", key = false },
new { name = "lastcontacted", type = "Edm.DateTimeOffset", key = false },
new { name = "worklocation", type = "Edm.GeographyPoint", key = false },
}
};
var response = client.PostAsync("https://scottgu-dev.search.windows.net/indexes/?api-version=2014-07-31-Preview",
new StringContent(JsonConvert.SerializeObject(index), Encoding.UTF8, "application/json")).Result;
response.EnsureSuccessStatusCode();
デプロイコードの一部として、またはアプリケーション初期化の一部として、このコードを実行することができます。
検索インデックスへの紐付け
Azure Searchは、データをインデックスするのにプッシュAPIを使用します。一度に最大1000ドキュメントの一括処理で、このAPIを呼び出すことができます。インデックスにデータをプッシュするのはあなたのコードなので、元データは、AzureのSQLデータベース、DocumentDbデータベース、ブロブ/テーブルストレージなどのどこかにあります。オンプレミスやAzureクラウドプロバイダー以外にあるデータでも紐付けすることができます。
インデックスは1回限りの操作ではないことにご注意ください。恐らく、データソースからロードする初回のデータセットがあると思いますが、その後、新しいドキュメントのプッシュ、また既存データの更新や削除を行うと思います。Azure Webサイトを使用する場合、これは自然なWebjobsのシナリオで、これによりバックグラウンドで定期的にインデックス作成のコードを実行することができます。
ホストの場所に関わらず、データをインデックスするコードは、ソースからデータを取得し、Azure Searchにそれをプッシュする必要があります。以下の例では、データを簡単に作成していますが、上記で特定したインデックスフィールドに一致するオブジェクト一式を生成するSQLやLINQクエリなどの結果をどのように使用しているかを確認することができます。
var batch = new
{
value = new[]
{
new
{
id = "221",
fullname = "Jay Adams",
tags = new string[] { "work" },
lastcontacted = DateTimeOffset.UtcNow,
worklocation = new
{
type = "Point",
coordinates = new [] { -122.131577, 47.678581 }
}
},
new
{
id = "714",
fullname = "Catherine Abel",
tags = new string[] { "work", "personal" },
lastcontacted = DateTimeOffset.UtcNow,
worklocation = new
{
type = "Point",
coordinates = new [] { -121.825579, 47.1419814}
}
}
}
};
var response = client.PostAsync("https://scottgu-dev.search.windows.net/indexes/contacts/docs/index?api-version=2014-07-31-Preview",
new StringContent(JsonConvert.SerializeObject(batch), Encoding.UTF8, "application/json")).Result;
response.EnsureSuccessStatusCode();
インデックスの検索
インデックスを作成し、それをデータに紐づけると、そのインデックスに対して検索リクエストを行うことができます。検索は、インデックスに対する簡単なHTTP GETリクエストで、最初にアップロードされたデータだけでなく、付随するスコアリング情報なども返します。
例えば、abel workのようなユーザー入力が含まれるsearchText という文字列がある以下のコードを実行して簡単な検索を行うことができます。
var response = client.GetAsync("https://scottgu-dev.search.windows.net/indexes/contacts/docs?api-version=2014-07-31-Preview&search=" + Uri.EscapeDataString(searchText)).Result;
response.EnsureSuccessStatusCode();
dynamic results = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
foreach (var result in results.value)
{
Console.WriteLine("FullName:" + result.fullname + " score:" + (double)result["@search.score"]);
}
その他の情報
上記はどのようなことができるかの簡単なシナリオになります。検索によりできることは他にもたくさんあります。例えば、結果に対して、フィルタ、ソート、プロジェクト、ページなどを行うために、クエリ文字列オプションを使用することができます。ヒット強調表示やファセットを使用してWebやモバイルUIでオートコンプリートを実装し、結果や提案を引き出すのによりリッチな方法を作成することができます。
この例では、デフォルトのランキングモデルを使用しました。これは、スコアを計算するために、インデックス付きのテキストや検索文字列の統計を使用します。また、アプリケーションのニーズに合った方法でスコアをモデリングする独自のスコアリングのプロファイルを作成することもできます。
開始方法やもっと高度に活用するケースについての詳細は、Azure Searchドキュメンテーションをご確認ください。すべてのAzure購読者が無償で利用できる無償層で、アプリケーションと完全に統合されたSearchを利用しない理由はもはやないでしょう。



