AWS CloudSearch を使った映画データセットの全文検索の実装

AWS CloudSearch を使った映画データセットの全文検索の実装

岩佐 孝浩
岩佐 孝浩
7 min read
CloudSearch

はじめに

AWS CloudSearchApache 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_average5.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_average7.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! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023