AWS CloudSearch を使った映画データセットの全文検索の実装
はじめに
AWS CloudSearch は Apache Solr をベースとした強力な 全文検索 機能を提供します。この記事では、AWS CloudSearch を使用して映画データセットの全文検索を実装する方法を解説します。
CloudSearch Domain セットアップ
CloudSearch Domain 作成
まず、以下のコマンドを使用して CloudSearch ドメインを作成します。
aws cloudsearch create-domain --domain-name searching-movies-data
このコマンドは次のようなレスポンスを生成します。
{
"DomainStatus": {
"DomainId": "123456789012/searching-movies-data",
"DomainName": "searching-movies-data",
"ARN": "arn:aws:cloudsearch:ap-northeast-1:123456789012:domain/searching-movies-data",
"Created": true,
"Deleted": false,
"DocService": {},
"SearchService": {},
"RequiresIndexDocuments": false,
"Processing": false,
"SearchPartitionCount": 0,
"SearchInstanceCount": 0
}
}
公式ドキュメント によると、CloudSearch ドメインの作成には通常 約 10 分 かかります。
It takes about ten minutes to create endpoints for a new domain.
以下のコマンドを実行して、ドメイン作成のステータスを確認できます。
aws cloudsearch describe-domains --domain-name searching-movies-data
コマンド出力に Processing: false
と表示された場合、そのドメインとエンドポイントは完全に作成され、使用可能です。
{
"DomainStatusList": [
{
"DomainId": "123456789012/searching-movies-data",
"DomainName": "searching-movies-data",
"ARN": "arn:aws:cloudsearch:ap-northeast-1:123456789012:domain/searching-movies-data",
"Created": true,
"Deleted": false,
"DocService": {
"Endpoint": "doc-searching-movies-data-xxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com"
},
"SearchService": {
"Endpoint": "search-searching-movies-data-xxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com"
},
"RequiresIndexDocuments": false,
"Processing": false,
"SearchInstanceType": "search.small",
"SearchPartitionCount": 1,
"SearchInstanceCount": 1,
"Limits": {
"MaximumReplicationCount": 5,
"MaximumPartitionCount": 10
}
}
]
}
アクセスポリシー更新
セキュリティを強化するために、ドメインのアクセスポリシーを更新し、自分の IP アドレスからのみアクセスを許可します。
aws cloudsearch update-service-access-policies \
--domain-name searching-movies-data \
--access-policies '
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": ["cloudsearch:*"],
"Condition": {"IpAddress": {"aws:SourceIp": "xxx.xxx.xxx.xxx/32"}}
}
]
}'
インデックスフィールド設定
データセットの構造に基づいて インデックスフィールド を定義します。この投稿では Kaggle の The Movies Dataset (CC0: Public Domain) を使用します。以下はインデックスフィールドを定義するコマンドの例です。
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name adult --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name belongs_to_collection --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name budget --type double
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name genres --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name homepage --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name id --type int
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name imdb_id --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name original_language --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name original_title --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name overview --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name popularity --type double
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name poster_path --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name production_companies --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name production_countries --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name release_date --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name revenue --type int
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name runtime --type double
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name spoken_languages --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name status --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name tagline --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name title --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name video --type text
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name vote_average --type double
aws cloudsearch define-index-field \
--domain-name searching-movies-data --name vote_count --type int
完了後に、次のコマンドでインデックスを開始します。
aws cloudsearch index-documents --domain-name searching-movies-data
データセットのインデクシング
Kaggle からデータセットをダウンロードし、最初の 1,000 行を含むサンプルファイルを準備します。
head -1000 movies_metadata.csv > sample.csv
CloudSearch ではコンソールを介して CSV ファイル を直接インデックスできますが、AWS CLI の aws cloudsearchdomain upload-documents
コマンドは JSON または XML 形式のみに対応しています。
CloudSearch コンソールの「Upload documents」オプションを使用して CSV ファイル をアップロードします。アップロード後、ドキュメント数を確認し、正常にインデックスされたことを確認してください。
Actions
メニューの Upload documents
をクリックします。
CSV ファイルを選択し、次へ
をクリックしてください。
CSV のカラムを確認後、Upload documents
をクリックします。
処理が完了すると、998件のレコード(ヘッダーを除く)が正常にインデックスされたことが確認できます。
検索クエリの実行
テキストの検索
title
および overview
フィールドでキーワード house
を検索するには、次のようにします。
curl --location -g --request GET 'https://search-searching-movies-data-xxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q=house&q.options={fields:["title","overview"]}&return=title,overview' | jq .
詳しくは、公式ドキュメントをご参照ください。
レスポンスには、次のような一致する結果が含まれます。
{
"status": {
"rid": "8fDJv8swsgEK1DyD",
"time-ms": 1
},
"hits": {
"found": 26,
"start": 0,
"hit": [
{
"id": "local_file_466",
"fields": {
"overview": "Hip Hop duo Kid & Play return...",
"title": "House Party 3"
}
},
...
]
}
}
数値の検索
vote_average
が 5.0
の映画を検索:
curl --location --request GET 'https://search-searching-movies-data-xxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q.parser=structured&q=vote_average:5.0&return=title,overview' | jq .
詳しくは、公式ドキュメントをご参照ください。
レスポンスには、次のような一致する結果が含まれます。
{
"status": {
"rid": "w+Xgv8swwQEK1DyD",
"time-ms": 0
},
"hits": {
"found": 35,
"start": 0,
"hit": [
{
"id": "local_file_144",
"fields": {
"overview": "Far from home...",
"title": "The Amazing Panda Adventure"
}
},
...
]
}
}
範囲の検索
vote_average
が 7.0
より大きい映画を検索:
curl --location -g --request GET 'https://search-searching-movies-data-xxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q.parser=structured&q=vote_average:[7.0,}&return=title,overview' | jq .
詳しくは、公式ドキュメントをご参照ください。
レスポンスには、次のような一致する結果が含まれます。
{
"status": {
"rid": "vJ/vv8swyAEK1DyD",
"time-ms": 2
},
"hits": {
"found": 254,
"start": 0,
"hit": [
{
"id": "local_file_1",
"fields": {
"overview": "Led by Woody, Andy's toys...",
"title": "Toy Story"
}
},
...
]
}
}
リソースの削除
使用が終わったら、不要な料金を避けるために CloudSearch ドメインを削除します。
aws cloudsearch delete-domain --domain-name searching-movies-data
まとめ
AWS CloudSearch は シンプルな全文検索 機能を実装するための強力なサービスです。この投稿に従うことで、映画カタログなどのデータセットに対して検索可能なドメインを簡単に設定・管理できます。
Happy Coding! 🚀