Slide 1

Slide 1 text

Azure Search を使って、 Windows Phone 8.1 アプリを作った話

Slide 2

Slide 2 text

⾃⼰紹介 • 名前 • Twitter : @TonyTonyKun(トニー) • 仕事 • C#で業務アプリケーションを開発しています。 • Azure と ASP.NET を使っています。 • XAML も書いたりします。 • Blog • ROMANCE DAWN for the new world • http://gooner.hateblo.jp/

Slide 3

Slide 3 text

きっかけ • MADOSMA • この微妙な時期に Windows Phone を⽇本で発売したマウスコンピュータ の漢気に応えたかった • おでコン(Windows Phone ⾮公式アプリコンテスト) • 個⼈でアプリコンテストを開催すると聞いて、応援したくなった • あと、賞品もかなり豪華だった • Xamarin のライセンス • 無料で Xamarin のライセンスが取得できるらしい

Slide 4

Slide 4 text

アプリのネタは? Season 5 キター!!!

Slide 5

Slide 5 text

こんなアプリを作りました https://www.microsoft.com/store/apps/9NBLGGH35LZ6

Slide 6

Slide 6 text

DEMO

Slide 7

Slide 7 text

DEMO

Slide 8

Slide 8 text

DEMO

Slide 9

Slide 9 text

アーキテクチャ

Slide 10

Slide 10 text

Azure Search • Search as a Service(検索エンジンのサービス) • 検索キーワード候補のリアルタイム表⽰ • この商品を買った⼈はこんな商品を買っています • この記事に関連した記事があります • ここから 5 km 以内にあるレストランを検索する • 価格体系 • Free と Standard • 2015年7⽉に、⽇本にもデプロイされた • ⻄⽇本のみ • ⽇本語の精度は、改善中?

Slide 11

Slide 11 text

インデックスを作成 using (var connection = ApiConnection.Create("", "")) using (var client = new IndexManagementClient(connection)) { var createResponse = await client.CreateIndexAsync(new Index("") .WithStringField("id", f => f.IsKey().IsSearchable().IsRetrievable()) .WithStringField("title", f => f.IsSearchable().IsRetrievable()) .WithStringField("restaurant", f => f.IsSearchable().IsRetrievable()) .WithGeographyPointField("location", p => p.IsFilterable().IsSortable().IsRetrievable())); } RedDog.Search(https://www.nuget.org/packages/RedDog.Search/) ※ Microsoft Azure Search Library は、今はまだプレビュー版です。

Slide 12

Slide 12 text

緯度経度のデータをインポート using (var connection = ApiConnection.Create("", "")) using (var client = new IndexManagementClient(connection)) { var json = File.ReadAllText(@"C:¥Gourmet.json", Encoding.UTF8); var targets = JsonConvert.DeserializeObject>(json); foreach (var target in targets.Select((v, i) => new { value = v, index = i })) { var populateResponse = await client.PopulateAsync("", new IndexOperation(IndexOperationType.Upload, "id", (target.index + 1).ToString()) .WithProperty("title", target.value.Title) .WithProperty("restaurant", target.value.Restaurant) .WithProperty("location", new { type = "Point", coordinates = new[] { target.value.Location.lng, target.value.Location.lat } })); } }

Slide 13

Slide 13 text

地理空間検索 using (var connection = ApiConnection.Create("", "")) using (var client = new IndexQueryClient(connection)) { var query = new SearchQuery() .OrderBy(String.Format("geo.distance(location, geography'POINT({0} {1})')", 139.766084, 35.681382)).Top(10); var response = await client.SearchAsync("", query); return response.Body.Records.Select(x => new Gourmet { Id = int.Parse(x.Properties["id"] as string), Season = (int)(long)x.Properties["season"], Episode = (int)(long)x.Properties["episode"], Title = x.Properties["title"] as string, Restaurant = x.Properties["restaurant"] as string, }); }

Slide 14

Slide 14 text

まとめ • クラウドは、ちょっとしたアイディアを低コストで 実現できます。 • ⽇本でも Windows Phone を盛り上げていきま しょう。 • これから作るなら、UWPで。

Slide 15

Slide 15 text

ご清聴ありがとうございました。