SlideShare a Scribd company logo
Azure サービスを活用して作る
フルマネージドな全文検索アプリケーション
Yoichi Kawasaki
Azure Technology Solution Professional
Asia Global Black Belt
Slides for Azure Webinar: Azure Search
アジェンダ
• 導入編
• Azure Search概要
• Azureを活用した検索サービス事例
• 実践編
• アプリケーション開発
• モニタリング・分析
• Q&A
Azureサービスを使った検索サービス構築
Azure Search
• 強力かつ豊富な検索機能をシンプルなプロトコル
とAPIで提供
• 完全マネージドでスケーラブル
• 充実した自然言語解析、ランキング調整機能
検索の専門的な知識不要で容易にリッチ検索アプリの構築を可能と
し、また完全マネージドで運用管理コストも削減することができる
→ アプリ/サービス開発に集中できる
全文検索機能を提供するSearch-as-a-Service (PaaS)
検索エクスペリエンス
地理空間検索
全てAzure Searchの機能で実現しています
http://azjobsdemo.azurewebsites.net/
シンプルなAPIとフォーマット
インデックス追加・更新 /indexes/<indexname> PUT
インデックス一覧表示 /indexes GET
インデックス統計情報取
得
/indexes/<indexname>/stats GET
インデックスの削除 /indexes/<indexname> DELETE
ドキュメント追加・削除 /indexes/<indexname>/docs/index POST
検索 /indexes/<indexname>/docs GET
ドキュメントlookup /indexes/<indexname>/docs/<key> GET
ドキュメント数取得 /indexes/<indexname>/docs/$count GET
サジェスション /indexes/<indexname>/docs/suggest GET
テストアナライザ /indexes/<indexname>/analyze POST
https://<アカウント名>.search.windows.net
{
"@odata.context":
"https://yoichikademo.search.windows.net/
indexes('messages')/$metadata#Collection(
Microsoft.Azure.Search.V2016_09_01.IndexR
esult)",
"value": [
{ "errorMessage": null, "key": "1",
"status": true, "statusCode": 201 },
{ "errorMessage": null, "key": "2",
"status": true, "statusCode": 201 },
{ "errorMessage": null, "key": "3",
"status": true, "statusCode": 201 }
]
}
※ APIバージョン 2016-09-21の機能一覧。バージョンごとの機能についてはこちらを参照ください
Azure Search アーキテクチャ全図
QueryParser Search
Engine
Analyzer
IndexWriter
インデックスSimple lucene
Analyzed
terms
Query
terms
Query
tree
Query
text
Documents
terms
Analyzed
terms
Retrieve Ingest
Analyzer
検索処理
• クエリーを元に
トークン引き当て
• ランキング処理
クエリ文を解析し内部
クエリ―形式に変換
テキスト解析を行いトークンの
展開、変換、削除などを行う
転置インデックス
インデックス生成処理
2種類のインデックス更新方式
IndexWriter
Indexer REST API
インデクサーによる定期更新
• インデクサーの定期的実行による更新: 最小5分
• 変更、削除検知し差分実行
• データソースのフルクロール可
インデクシングAPIで直接更新
• POST: /indexes/<name>/docs/index
• アップロード 、マージ、削除など
• 1度のバッチ: 最大 1,000 ドキュメント
• リアルタイムに近いデータ更新
スケーラビリティ - 検索・データ
1 ~ 12
1 ~ 12
オンラインでスケール設定可能
APIやポータルからオンラインでスケール設定変更が可能
パーティション
レプリカ
多様な検索対象データ
 データソース
 ファイル(BLOB)、DRMBS、NoSQLなど
 データの種類
構造化データ 非構造化データ
• カタログ検索
• ウェブ検索
• XML/JSONデータ検索
• PDF、オフィスドキュメント
• ファイル種類ごとの形式に合わせたライブラリによりテキスト抽出
• テキスト抽出ライブラリ: Apache Tikaなど
• Azure Search Blobストレージインデクサー:オフィス、PDF,
HTMLからのインデックス作成が可能
• 画像、音声・動画データ
• OCR、画像認識(人物・物)、音声認識技術を利用してメタ情報を構
造化データとして抽出
• Cognitive Services、Azure Media Servicesメディア分析:画像、
音声・動画データからのメタデータ抽出可能
メディア x 音声認識 x 機械翻訳 x 全文検索
https://github.com/shigeyf/ai-digitalmedia
Azureサービスを活用した検索サービス事例
国立大学法人岐阜大学 IR情報基盤
https://www.microsoft.com/ja-jp/casestudies/gifu-u.aspx
Azureサービスを活用した検索サービス事例
富士フィルムソフトウェア株式会社様 - 「IMAGE WORKS」
• Azure の PaaS を最大限に活用しサービスの安定性、拡張性、利便性の飛躍的向上
• Cosmos DB (NoSQL) とAzure Search (全文検索) を利用した性能向上
https://www.microsoft.com/ja-jp/casestudies/ffs.fujifilm.aspx
全文検索
アプリケーション開発
サンプルアプリケーション
 Q&Aナレジッジベース全文検索アプリ
 サンプルソースコード
 https://github.com/yokawasa/azure-search-qna-demo
サービスのプロビジョニング
 ポータルでアカウント作成
 アカウント名設定
 リージョン設定
 SKUの選択
 Free, Basic, Standard
S1,S2,S3
途中でSKUの変更ができ
ないのであらかじめ余裕
を持ったKUの選択が必要
インデックスの作成
管理ポータルもしくはAPI経由でインデックスのスキーマ定義を行う
スキーマで定義するのは大きく次の3つ
• 検索フィールド
• 主キー
• データ型: String, Collection(string list), Int32/64,
Double, DateTime, Boolean, Geography-point
• 属性: Retrievable, Filterable, Sortable, Facetable,
Searchable
• アナライザー(言語アナライザー)
• サジェスタ
• サジェッション候補用フィールド定義
• スコアリングプロファイル
• カスタムのスコア付け動作の定義。ランキングに影響
https://docs.microsoft.com/en-us/rest/api/searchservice/Create-Index
アナライザーの選択
• アナライザーとは?
• インデックス生成処理とクエリ処理の両方で実行されるテキスト解析処理
• フィールド単位で個別のアナライザーを設定可能
• 2種類の言語別アナライザー
• Luceneアナライザー
• Apache Luceneの中核プロジェクトLucene Coreに含まれる言語別アナライザー
• 35アナライザーが利用可能(2017年5月時点)
• 日本語Luceneアナライザーはja.lucene(”kuromoji”)
• Microsoftアナライザー
• マイクロソフト独自の自然言語処理技術をベースとした言語別アナライザー
• 50アナライザーが利用可能(2017年5月時点)
• 日本語Microsoftアナライザーはja.microsoft
日本語の場合ja.luceneかja.microsoftの2択と考えてよい
https://docs.microsoft.com/en-
us/rest/api/searchservice/language-support
スキーマ変更に関する注意点
スキーマの更新は限定的にサポート
〇
✖
• 新しいフィールドの追加
• 新しいフィールドが追加されると既存ドキュメントの追
加フィールドの値はNULL扱い
• 既存フィールドの種類変更、削除
インデックス作成 – 管理ポータル1
基本設定
フィールド属性
アナライザー
設定
サジェスタ設定
インデックス作成 – 管理ポータル2
基本設定
フィールド属性
アナライザー
サジェスタ設定
スコアリング
プロファイル設定
CORS設定
インデックス作成 – REST API
POST /indexes?api-version=2016-09-01
Host: qnademo.search.windows.net
api-key: 91FAB1CDBD75CF1D39491043BF3491AC
Content-Type: application/json
{
"name": "qna",
"fields": [
{ "name":"id", "type":"Edm.String", "key":true, "retrievable":true, "searchable":false, "filterable":false,
"sortable":false, "facetable":false },
{ "name":"question", "type":"Edm.String", "retrievable":true, "searchable":true, "filterable":false,
"sortable":false, "facetable":false,"analyzer":"ja.lucene"},
{ "name":"answer", "type":"Edm.String", "retrievable":true, "searchable":true, "filterable":false,
"sortable":false, "facetable":false,"analyzer":"ja.lucene"},
{ "name":"category", "type":"Edm.String", "retrievable":true, "searchable":false, "filterable":true,
"sortable":true, "facetable":true }
],
"suggesters": [
{ "name":"questionsg", "searchMode":"analyzingInfixMatching", "sourceFields":["question"] }
],
"scoringProfiles": [
{
"name": "weightedFields",
"text": {
"weights": {
"question": 9,
"answer": 1
}
}
}
],
"corsOptions": {
"allowedOrigins": ["*"],
"maxAgeInSeconds": 300
}
}
基本設定
フィールド属性
アナライザー
サジェスタ設定
CORS設定
スコアリング
プロファイル設定
インデックス更新 – 直接PUSH
APIにドキュメントを直接POSTしてリアルタイム に近いデータ 更新が可能
更新内容反映までの時間はその時のシステムの負荷状況により異なります
POST /indexes/qna/docs/index?api-version=2016-09-01
Host: qnademo.search.windows.net
api-key: 91FAB1CDBD75CF1D39491043BF3491AC
Content-Type: application/json
{
"value": [
{
"@search.action": "upload",
"id": "37e308d0-c62f-45b5-b953-363c3b77c1ea”,
"question": "Azure Cosmos DB とは何ですか?”,
"answer": "Azure Cosmos DB は、グローバルにレプリケートされたマルチモデル…",
"category": "CosmosDB"
},
{
"@search.action": "upload",
"id": "94e26eff-3048-4275-a8d0-4b4856dc6b3c",
"question": "提供されているアルゴリズムは、R または Python で記述されていますか”,
"answer": "いいえ。これらのアルゴリズムは、多くの場合、より優れたパフォーマンスを… ",
"category": "MachineLearning"
},
…
]
}
一度に最大1000ドキュメントまで、
もしくはBODYサイズ最大16MB
までPOSTすることが可能。
インデックス更新 – インデクサー利用
• インデクサーの設定により、特定のデータ
ソースから定期的に更新データをポーリング
してインデックスの更新をすることが可能
• 設定方法
• 管理ポータル経由で設定: 比較的簡単に設定可能、
ただし一部機能は制御不可
• REST API経由で設定: コードにより細かな制御
が可能
• インデクサー設定の流れ
1. Azure Searchにデータソースを登録
2. Azure Searchに更新先インデックスを作成
3. Azure Searchにインデクサーを設定
IndexWriter
Indexer
インデクサーによる更新設定 - 管理ポータル
①データソース登録
②ターゲット
インデックス設定
③インデクサー登録
Cosmos DBをデータソースとしたインデクサー設定例(更新対象インデックスqna)
インデクサーによる更新設定 – REST API
Cosmos DBをデータソースとしたインデクサー設定例(更新対象インデックスqna)
POST /datasources?api-version=2016-09-01
Host: qnademo.search.windows.net
api-key: 91FAB1CDBD75CF1D39491043BF3491AC
Content-Type: application/json
{
"name": ”qnadb",
"type": "documentdb",
"credentials": {
"connectionString":
"AccountEndpoint=https://yoichikademo.documents.azure.com;Accou
ntKey=Tl1+ikQtnExUisJ+BXwbbaC8NtUqYVE9kUDXCNust5aYBduhui29Xtxz3
DLP88PayjtgtnARc1PW+2wlA6jXJw==;Database=qna"
},
"container": {
"name": ”qna",
"query": "SELECT s.id, s.question, s.answer,
s.category, s._ts FROM Sessions s WHERE s._ts > @HighWaterMark"
},
"dataChangeDetectionPolicy": {
"@odata.type":"#Microsoft.Azure.Search.HighWaterMarkChangeDetec
tionPolicy",
"highWaterMarkColumnName": "_ts"
}
}
POST /indexers?api-version=2016-09-01
Host: qnademo.search.windows.net
api-key: 91FAB1CDBD75CF1D39491043BF3491AC
Content-Type: application/json
{
"name": ”qnaindexer",
"dataSourceName": ”qnadb",
"targetIndexName" : ”qna",
"schedule":
{
"interval" : "PT5M",
"startTime" :"2017-09-25T00:00:00Z"
}
}
qnadb
qnaindexerデータソース登録対象の
DocumentDBの接続文字列
DocumntDBからの更新対象
データ取得用クエリ
インデクサ名
データソース名
更新対象インデックス名
qna
DocumentDB
コレクション名
データソース名
検索クエリによるドキュメント取得
エンドポイント (METHOD:GET)
https://<アカウント名>.search.windows.net/indexes/<インデックス名>/docs
&search=keyword
&searchMode=all
&queryType=full
?api-version
=2016-09-01
&$count=true
&$top=5
&$skip=10
&$select=title,content
&$orderby=updatetime desc
&facet=category
&highlight=title
共通
結果表示用
全文検索関連パラメータ
search • 全文検索用キーワード指定
• アナライザ処理、ランキング処理適用
searchMode Booleanクエリ評価方法指定
(all |any)
queryType クエリパーサーを選択:Simple or Lucene
(simple|full)
&$filter=
category eq x
searchや$filter、その他クエリ文やパラメータに関する参考セッション
de:code2017: その情報うまく取り出せていますか? 〜 意外と簡単、Azure Search で短時間で
検索精度と利便性を向上させるための方法
https://channel9.msdn.com/Events/de-code/2017/DI08
絞り込み用
Q&Aアプリ - 検索クエリ解説
エンドポイント (METHOD:GET)
/indexes/<インデックス名>/docs
api-version=2016-09-01
$top=50
$select=id,question,answer,category
highlight=question,answer
facet=category,count:10
searchMode=any
queryType=full
search=Azure~1
$filter=category%20eq%20%27AzureSearch%27'
APIバージョン指定
上位50件取得
検索で取得するフィールド指定
検索ヒットした語句をハイライトするフィールド指定
ファセット用フィールド指定、上位10ファセット取得
Booleanクエリ評価方法指定: any=X OR Yで広く取得
クエリパーサーを選択: full = Luceneクエリパーサー
全文検索キーワード、「~1」=Luceneクエリのあいまい
検索で1文字入れ替えてマッチするもの全てヒット
フィルター指定: 「category eq AzureSearch」
をURLエンコード
Simple Query syntax
Lucene Query syntax
サジェッション
入力したキーワード文字列に関連の深い語句を逐次予測して表示するための機能
事前に検索対象フィールドをサジェスタ(suggesters)登録する必要があります
"suggesters": [
{
"name":"questionsg",
"searchMode":"analyzingInfixMatching",
"sourceFields":["question"]
}
],
/indexes/qna/docs/suggest
suggesterName
search Azu
文の先頭または中間にある
フレーズのマッチング
(2017-09時点でこのモードのみ)
{
"@odata.context":
"https://qnademo.search.windows.net/indexes(‘qna
')/$metadata#docs(id)",
"value":
{ "@search.text": "Azure AD、Office 365、Azure
の関係はどうなっていますか?",
”id": "3290cbb7-2f62-4948-b984-1bced9a6cb5f"},
{"@search.text": "Azure Cosmos DB の MongoDB
用 API とは何ですか?",
”id": "af19017e-1c72-4b34-b121-9b7efa91cc4a"},
…
]}
https://docs.microsoft.com/en-us/rest/api/searchservice/suggesters
Q&Aアプリ - サジェスションクエリ解説
エンドポイント (METHOD:GET)
/indexes/<インデックス名>/docs/suggest
api-version=2016-09-01
$top=10
select=question
suggesterName=questionsg
fuzzy=true
search=Azure
APIバージョン指定
上位50件取得
検索で取得するフィールド指定
サジェスタの指定
Fuzzy(あいまい)検索有効化
全文検索キーワード指定
もちろんフィルタと合わせての指定も可能
&search=Azure
&$filter=category%20eq%20%27AzureSearch%27'
オートコンプリートUX - typeahead.js
https://github.com/twitter/typeahead.js
• オートコンプリートのユーザーエクスペリエンス
を簡単に実装できる
• 大きくBloodhoundとTypeaheadの2種類
• Bloodhound: suggestionエンジン
• Typeahead: UIライブラリ
• 本サンプル(左)ではBloodhoundのみ使用
サジェスチョン
出力結果表示用form
Bloodhoundを使った
サジェスションデータ
取得ロジック
typeahead.jsの
インクルード
ファセット・ナビゲーション
ドリルダウンナビゲーションを提供するフィルター処理の一種
スキーマでfacetable:true、filterable:trueで登録されているフィールドを使用
して、クエリ時に作成します
{
"name":”cateogry", "type":"Edm.String",
"searchable": false, "filterable":true,
"sortable":true, "facetable":true
},
インデックス定義でフィールドのファセット有効化
ファセットリクエスト
/indexes/qna/docs
facet
search
"@search.facets": {
"color@odata.type":
"#Collection(Microsoft.Azure.Search.V2016_09_01.Q
ueryResultFacet)",
”category": [
{ "count": 65, "value": ”CosmosDB “ },
{ "count": 35, "value": ”MachineLearning“ },
{ "count": 21, "value": ”AzureAD“ },
{ "count": 17, "value": ”AppInsights “ },
{ "count": 12, "value": “LogAnalytics“ }
…
],
ここでは1ファセットのみ。
複数のファセットを指定す
ることも可能
検索精度のチューニングについて
検索精度チューニングのための主要設定箇所は以下4点
ポイント 役割 設定箇所
アナライザー テキストのトークン化 インデックススキーマ
クエリ トークンの絞り込み、マッチング
の挙動と結果評価の制御
クエリパラメータ
ランキング 関連度(スコア)の計算 スコアリングプロファイル
クエリパラメータ
同義語辞書 辞書ベースのキーワードの展開
(クエリ側でのみ)
同義語辞書
インデックススキーマ
検索精度チューニングに関する参考セッション
de:code2017: その情報うまく取り出せていますか? 〜 意外と簡単、Azure Search で短時間で
検索精度と利便性を向上させるための方法
https://channel9.msdn.com/Events/de-code/2017/DI08
Azure Search UIライブラリ- AzureSearch.js
https://github.com/Yahnoosh/AzSearch.js • Azure Searchプロダクトチーム主要開発者によ
り開始されたOSSライブラリ(TypeScript)
• ライブラリが提供するオブジェクト操作により非
常に短いコードでサーチ用UIを組み立てることが
可能(サーチボックス、結果出力、ページネー
ション、ファセット、サジェスション、 etc)
• テンプレートジェネレータ
• http://azsearchstore.azurewebsites.net/
azsearchgenerator/index.html
• デモサイト
• https://azsearchstore.azurewebsites.net
/realestate.html
モニタリング・分析
検索ログ・メトリックスの有効活用
• 検索オペレーションログやメトリックスの自動収集をポータルで有効化
• 収集データはAzure Storageに保存
ポータルで機能有効化と保存先ストレージの選択 オペレーションログ メトリックス
保存
コンテナ
insights-logs-
operationlogs
insights-metrics-
pt1m
内容 • インデックス作成
• インデクシング
• 検索クエリ
• サジェストクエリ
• など
• レイテンシー
• クエリ数/秒
(QPS)
※分単位
ストレージにログ保存
オペレーションログ・メトリック有効化
検索ログサンプル
{
"time": "2016-05-07T09:15:24.3901416Z",
"resourceId": "/SUBSCRIPTIONS/87C7C7F9-0C9F-
47D1-A856-1305A0CBFD7A/RESOURCEGROUPS/RG-SEARCH-
DEMO/PROVIDERS/MICROSOFT.SEARCH/SEARCHSERVICES/YO
ICHIKADEMO0",
"operationName": "Query.Search",
"operationVersion": "2015-02-28",
"category": "OperationLogs",
"resultType": "Success",
"resultSignature": 200,
"durationMS": 41,
"properties": { "Description" : "GET
/indexes('decodesessions2016')/docs" , "Query" :
"?$top=12&$select=id,title,url,thumbnail,descript
ion&api-version=2015-02-28&search=Azure" ,
"Documents" : 12, "IndexName" :
"decodesessions2016" }
}
オペレーションログ例:クエリログ
{
"resourceId": "/SUBSCRIPTIONS/87C7C7F9-
0C9F-47D1-A856-1305A0CBFD7A/RESOURCEGROUPS/RG-
SEARCH-
DEMO/PROVIDERS/MICROSOFT.SEARCH/SEARCHSERVICES
/YOICHIKADEMO0",
"metricName": "SearchQueriesPerSecond",
"time": "2016-05-13T13:14:00Z",
"average": 0.05,
"minimum": 0,
"maximum": 2,
"total": 3,
"count": 60,
"timeGrain": "PT1M"
}
メトリックログ例:QPS
ログ分析: Power BIによる可視化
• ストレージにアーカイブされたログはPower BI連携により簡単に可視化が可能
• 連携はAzure Search用Power BIコンテンツパックを利用
https://powerbi.microsoft.com/ja-jp/documentation/powerbi-content-pack-azure-
検索トラフィック分析 - App Insights連携
• Application Insightsと連携することでより具体的なトラフィックの分析を実
装することが可能です。ユーザーとその行動に関する洞察を明らかにするこ
とができます。
• 必要な設定:
1. 検索トラフィック分析用のApplication Insightsリソースを作成
2. ユーザーの検索リクエストデータと検索結果に対するクリックデータをAppInsightsにロギングするため
にクライアントサイドにコードを埋め込む
3. Power BI Desktopでレポーティング詳細を確認(BIテンプレートが利用可能)
• Power BI Desktopテンプレートで得られる情報
• クリック率 (CTR): 検索総数に対する特定のドキュメントをクリックしたユーザー数の割合。
• クリックされていない検索語句: クリックが登録されていない上位クエリの語句
• 最もクリックされた人気ドキュメント語句
• 人気のある語句とドキュメントの組み合わせ
• クリック時間
https://docs.microsoft.com/en-us/azure/search/search-traffic-analytics
Azure サービスを活用して作るフルマネージドな全文検索アプリケーション
APPENDIX
Free Basic Standard S1 Standard S2
Maxサービス数 1 12 12 6
Maxインデック
ス数/サービス
3 5 50 200
Maxドキュメン
ト数/サービス
1000
0
100万 1500万/P
(1.8億/サービス)
6000万/P
(7.2億/サービス)
Maxストレージ
サイズ/サービス
50MB 2GB 25GB/P
(300GB/サービ
ス )
100GB/P
(1.2TB/サービス)
Maxパーティ
ション数/サービ
ス
N/A 1 12 12
Maxレプリカ数/
サービス
N/A 3 12 12
Maxサーチユ
ニット数/サービ
ス
N/A 3 36 36
クエリ数/秒
(QPS) 目安
N/A 〜3/R 〜15/R 〜60/R
Standard S3 Standard S3 HD
6 6
200 1000/P
(3000/サービス)
1.2億/P
(14億/サービス)
2000万/P
(100万/インデックス)
200GB/P
(2.4TB/サービス)
200GB/P
(600G/サービス)
12 3
12 12
36 36
>60/R >60/R
お試しから大規模まで充実したSKU
https://azure.microsoft.com/ja-jp/pricing/details/search/
Cognitive Services: 人工知能サービスAPI群
画像認識、音声認識、テキスト認識など、ディープ ラーニング手法による大きなコンピューティング
パワーを必要とする処理などを Azure の API Service として提供。 https://www.microsoft.com/cognitive-services/
AI x Search - 非構造化データ検索実装例
Liberty Of Corom
• プロジェクト概要
• スマホ、メール、スキャナを問いしてアップロードされたドキュメントや画像をデータ解析パイプライ
ンにかけて検索可能にするための一連のパイプラインを提供する。データ解析にMicrosoft Cognitive
Servicesを、全文検索エンジンにAzure Searchを利用
• プロジェクトサイト
• ソースコード: https://github.com/Corom/LibraryOfCorom
• 紹介ビデオ: https://channel9.msdn.com/Events/Build/2017/B8081#time=5m30s
• プロジェクト概要
• メディア x 音声認識 x 機械翻訳 x 全文検索
• ウェブフロント(コンテナ)、データ生成ワークフロー
全てサーバレスで実現
• ワークフロー
• ストレージコンテナにアップロードされた動画ファイル
をAzure Media Analyticsパイプラインを通じて映像
キャプション取得
• Microsoft Translatorにより多言語サブタイトル取得
• キャプション、サブタイトルは全文検索のためAzure
Searchでインデックス化
• 上記一連のワークフローはLogic App、Functionsにより
完全自動化
• プロジェクトサイト
• https://github.com/shigeyf/ai-digitalmedia
AI x Search - 非構造化データ検索実装例
AI Digital Media
ウェブクローリングシナリオ実装例
PythonスクレイピングフレームワークであるScrapyを利用したウェブクローリングシナリオ実装例
1. Scrapyにより特定サイト内コンテンツを
スクレイピング
2. スクレイピングで取得されたデータを
CosmosDB(データソース)に格納
3. Azure Searchのインデクサーが定期的
にCosmosDB更新内容を元にインデック
スを更新
https://github.com/yokawasa/scrapy-azuresearch-crawler-samples

More Related Content

PPTX
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
PDF
社内ドキュメント検索システム構築のノウハウ
PDF
Elasticsearch勉強会#44 20210624
PDF
MySQLで論理削除と正しく付き合う方法
PDF
そんなトランザクションマネージャで大丈夫か?
KEY
やはりお前らのMVCは間違っている
PDF
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
PPTX
AWSで作る分析基盤
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
社内ドキュメント検索システム構築のノウハウ
Elasticsearch勉強会#44 20210624
MySQLで論理削除と正しく付き合う方法
そんなトランザクションマネージャで大丈夫か?
やはりお前らのMVCは間違っている
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
AWSで作る分析基盤

What's hot (20)

PDF
Railsで作るBFFの功罪
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
PDF
よく聞くけど、「SharePoint リストの 5,000 件問題」ってなんなの?
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
PPTX
MongoDBが遅いときの切り分け方法
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
PDF
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
PDF
君はyarn.lockをコミットしているか?
PPTX
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
PDF
とある診断員とAWS
PDF
Pythonによる黒魔術入門
PDF
20190806 AWS Black Belt Online Seminar AWS Glue
PDF
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
PDF
これからSpringを使う開発者が知っておくべきこと
PDF
Amazon Redshiftによるリアルタイム分析サービスの構築
PDF
AWSのログ管理ベストプラクティス
Railsで作るBFFの功罪
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
こんなに使える!今どきのAPIドキュメンテーションツール
分散トレーシングAWS:X-Rayとの上手い付き合い方
よく聞くけど、「SharePoint リストの 5,000 件問題」ってなんなの?
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MongoDBが遅いときの切り分け方法
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
君はyarn.lockをコミットしているか?
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
とある診断員とAWS
Pythonによる黒魔術入門
20190806 AWS Black Belt Online Seminar AWS Glue
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
これからSpringを使う開発者が知っておくべきこと
Amazon Redshiftによるリアルタイム分析サービスの構築
AWSのログ管理ベストプラクティス
Ad

Similar to Azure サービスを活用して作るフルマネージドな全文検索アプリケーション (20)

PDF
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
PPTX
Azure Search クックブック
PDF
Azure Searchで作る検索サービス
PDF
DEV-018_Azure Search Deep Dive ~検索エクスペリエンス向上のためのノウハウ徹底解説~
PDF
Azure Search を使って Windows Phone 8.1 アプリを作った話
PPTX
How tousemicrosoftsearch 20200725
PDF
20180922 jazug8 cosmosdb_search
PDF
Integrating elasticsearch with asp dot net core
PDF
メディアコンテンツ向け記事検索DBとして使うElasticsearch
PDF
ライフエンジンを支える検索エンジンの作り方
PDF
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
PDF
Renewed using elasticsearchonaspnet-core5
PDF
Cogbot #30 Ignite 2021 アップデート Cognitive Search 編
PDF
Building modernapplicationwithelasiccloud
PDF
Microsoft Search @O365JPFUK
PDF
全文検索入門
PDF
JJUG CCC リクルートの Java に対する取り組み
PDF
Learn, build, and scale with elastic - realizing great programming experience...
PPTX
Microsoft Search - Microsoft Graph connector と Search Federation の概要
PPTX
20170127cognitive services search
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
Azure Search クックブック
Azure Searchで作る検索サービス
DEV-018_Azure Search Deep Dive ~検索エクスペリエンス向上のためのノウハウ徹底解説~
Azure Search を使って Windows Phone 8.1 アプリを作った話
How tousemicrosoftsearch 20200725
20180922 jazug8 cosmosdb_search
Integrating elasticsearch with asp dot net core
メディアコンテンツ向け記事検索DBとして使うElasticsearch
ライフエンジンを支える検索エンジンの作り方
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Renewed using elasticsearchonaspnet-core5
Cogbot #30 Ignite 2021 アップデート Cognitive Search 編
Building modernapplicationwithelasiccloud
Microsoft Search @O365JPFUK
全文検索入門
JJUG CCC リクルートの Java に対する取り組み
Learn, build, and scale with elastic - realizing great programming experience...
Microsoft Search - Microsoft Graph connector と Search Federation の概要
20170127cognitive services search
Ad

More from Yoichi Kawasaki (20)

PPTX
今Serverlessが面白いわけ v19.09
PDF
今Serverlessが面白いわけ
PDF
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
PDF
Azure Functions 2.0 Deep Dive - デベロッパーのための最新開発ガイド
PDF
デベロッパーのためのAzureクラウドネイティブスタック 〜 提供したい価値からはじめる高速+高可用+高付加価値ソリューション
PDF
Service Mesh Status Quo 2018: 2019年に向けたService Meshの現状課題の整理と考察
PDF
Azure Containers & Serverless Technology Options (After-Tech-Summit-2018 Edit...
PPTX
Istioサービスメッシュ入門
PPTX
コンテナ&サーバーレス:トレンドの考察と少し先の未来の展望
PPTX
アプリケーション開発者のためのAzure Databricks入門
PPTX
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
PDF
Kubernetes x PaaS – コンテナアプリケーションのNoOpsへの挑戦
PPTX
Azure Functions&Logic Appではじめるサーバレスアプリケーション開発 - 応用編 -
PPTX
Azure Functions&Logic Appではじめるサーバレスアプリケーション開発 - 入門編 -
PPTX
Web App for Containers + Cosmos DBで コンテナ対応したMEANアプリを作ろう!
PPTX
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
PPTX
Azure PaaSを活用したモダン E コマースソリューションの構築方法
PPTX
PythonによるAzureサーバレスアプリケーション開発 / Serverless Application Development with Python
PPTX
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
PPTX
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
今Serverlessが面白いわけ v19.09
今Serverlessが面白いわけ
クラウドネイティブ時代の分散トレーシング - Distributed Tracing in a Cloud Native Age
Azure Functions 2.0 Deep Dive - デベロッパーのための最新開発ガイド
デベロッパーのためのAzureクラウドネイティブスタック 〜 提供したい価値からはじめる高速+高可用+高付加価値ソリューション
Service Mesh Status Quo 2018: 2019年に向けたService Meshの現状課題の整理と考察
Azure Containers & Serverless Technology Options (After-Tech-Summit-2018 Edit...
Istioサービスメッシュ入門
コンテナ&サーバーレス:トレンドの考察と少し先の未来の展望
アプリケーション開発者のためのAzure Databricks入門
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
Kubernetes x PaaS – コンテナアプリケーションのNoOpsへの挑戦
Azure Functions&Logic Appではじめるサーバレスアプリケーション開発 - 応用編 -
Azure Functions&Logic Appではじめるサーバレスアプリケーション開発 - 入門編 -
Web App for Containers + Cosmos DBで コンテナ対応したMEANアプリを作ろう!
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
Azure PaaSを活用したモダン E コマースソリューションの構築方法
PythonによるAzureサーバレスアプリケーション開発 / Serverless Application Development with Python
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure サービスを活用して作るフルマネージドな全文検索アプリケーション

Editor's Notes

  • #5: 特徴3つ -> シンプルプロトコルとAPI → 容易なマルチプラットフォーム対応、他サービスとの連携が可能 -> マネージド、運用が楽にできて、スケーラブルですよ -> 自然言語処理やランキングだってしっかりやってます。調整することもできます。
  • #6: - 仕事を探すジョブ検索サービス。 全てAzure Searchの機能で実現しているショーケースサイト - サジェスト: 文字を入れていくと、その文字に続く候補が自動的に表示 地理空間データを標準でサポート: 自分の位置から5キロ以内のアイテムを探す これら全てAzure Searchで実現している。ここでお見せした機能以外にもいろいろあります。 ここで言いたいことは、Azure Searchは検索サービスに必要な基本的な機能は全て提供しているということ
  • #7: <前頁につづいて>ではどのように検索サービスの機能を提供しているのかというと、シンプルなI/Fとフォーマットで提供しています。 言いたいこと:シンプルI/Fとフォーマット →  - 開発が楽、どの言語でも実装可能。 - 他システムとの連携が非常に楽であるということ
  • #10: 最初のASの特徴として完全マネージドでスケーラブルといったが、どうスケーラブルなのかというと 検索負荷(QPS)に対してもデータサイズの増加の両面でスケーラブルである ASはレプリカ x パーティションのスケールマトリクスがある レプリカ: 多重度 パーティション: データ分割度 レプリカ x パーティションでそれぞれ検索リクエストの負荷 x データサイズの増大に対してスケール
  • #11: APIやポータルから変更可能
  • #12: 検索対象データについて整理する 1.データソース 2.データ種類 Apache Tika : Javaで開発されたドキュメント分析およびメタデータ抽出ツールキット(PPT, XLS, and PDF) 画像認識、音声認識、テキスト認識など、ディープ ラーニング手法による大きなコンピューティングパワーを必要とする処理などを Azure の API Service として提供。 OCR/images – full text search https://azure.microsoft.com/en-us/blog/how-to-leverage-ocr-to-full-text-search-your-images-within-azure-search/
  • #14: 多様な書式・形式で存在する膨大な情報資産を分析・活用したり、情報発信するための情報基盤の構築にAzureを採用 生のデータ (非構造化データ) を一元管理する Azure Cosmos DB や Azure Data Lake Store 、 Excel などさまざまなドキュメントの情報を任意に検索できる検索機能として Azure Search
  • #15: 富士フィルムソフトウェア様のIMAGE WORKS: B2B向けのイメージ ファイルに特化した管理、共有サービス これまでオンプレで組んでいたシステムに限界を感じていた、Azureに移行されPaasを最大限に活用しての安定性、拡張性を向上 特にAzure DocumentDB とAzure Searchを組み合わせて性能向上いただいた。この中の全文検索機能としてAzure Searchをご利用いただいている
  • #18: 日本はJapan Westのみ
  • #25: https://docs.microsoft.com/en-us/rest/api/searchservice/addupdate-or-delete-documents
  • #26: https://docs.microsoft.com/en-us/rest/api/searchservice/addupdate-or-delete-documents リピータブルな設定を行うためにはコード化してREST AP経由での設定をお勧めします
  • #28: https://docs.microsoft.com/en-us/rest/api/searchservice/addupdate-or-delete-documents
  • #29: クエリ―パラメータの整理 - 大きく4種類: Common, 全文検索、絞り込み、結果表示 - searchと$filterの2種類がありそれぞれ用途、使い方が異なる Search は全文検索用でアナライザ、ランキング処理が走る searchModeとqueryTypeはsearch関連のパラメータでそれぞれ全文検索の結果の集め方やどのクエリパーサーを使うのかを指定します 一方 $filterは絞り込みようのパラメータでアナライザ、ランキング処理は走りません。よって、searchに比べて$fitlerは軽いです。
  • #30: Simple: デフォルトのクエリ言語、queryTypeパラメータの規定値 Lucene: Apache Lucene の一部として開発された表現性の高いクエリ言語, スコープ、あいまい、類似、正規表現など
  • #32: サジェスションクエリでのあいまいはチルダ「~」で表現するのではなく、fuzzyというパラメータを指定することに注意
  • #44: これまでよくいただいた質問にスケーラブルといってもPaaSなので大規模向けは無理ですよね?  → たしかに制限はあります。が・・ 2016/11にS3 + S3 HDが出ました 2016/11/15 - Azure Search S3 と S3 High Density の一般提供開始 S3HDは Standard 3 High Density is designed for a large number of smaller indexes。 S3のオプションとして選択可能 SKUの選択について https://docs.microsoft.com/en-us/azure/search/search-sku-tier 注意点: Basic->Standardのような自動アップグレードができない(2016-10時点) Allow to upgrade the pricing tier https://feedback.azure.com/forums/263029-azure-search/suggestions/12931110-allow-to-upgrade-the-pricing-tier NEED UPDATE https://azure.microsoft.com/ja-jp/pricing/details/search/ https://azure.microsoft.com/ja-jp/documentation/articles/search-limits-quotas-capacity/