Amazon CloudSearch 検索ドメイン作成とデータ検索手順 (Amazon S3に格納したファイルからインデックス作成)

はじめに
===

自分の勉強がてら、Amazon CloudSearchにデータを登録して、CloudSearchでデータを検索する手順について記します。

CloudSearchでデータを検索するには、検索用の元データを記載したドキュメントファイルをCloudSearchへ登録する必要があります。CloudSearchは登録したドキュメントファイルを元にして、データ検索用のインデックスを生成します。

このページでは、Amazon S3にCloudSearch検索用の元データとなるドキュメントファイル(jsonファイル)をアップロードして、TokyoリージョンにCloudSearch検索ドメインを作成し、CloudSearchでデータを検索する手順について記します。

参考資料
===

Amazon CloudSearch 用にデータを準備
https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/preparing-data.html

Amazon CloudSearch ドメインへの検索リクエストの送信
https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/submitting-search-requests.html

Amazon CloudSearch でのテキストの検索
https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/searching-text.html

Amazon CloudSearch のテキスト分析スキームの設定
https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/configuring-analysis-schemes.html

Amazon CloudSearch設定手順
===

## (1) AWSマネジメントコンソールへログインします。

画面右上のTokyoリージョン「アジアパシフィック (東京)」をクリックします。

## (2) AWSマネジメントコンソールの「CloudSearch」をクリックします。

https://ap-northeast-1.console.aws.amazon.com/cloudsearch/home?region=ap-northeast-1#

## (3)「Create a new search domain」をクリックします。

「Welcome to Amazon CloudSearch」画面が表示されます。
「Create a new search domain」をクリックします。

## (4) CloudSearch検索用のドキュメントファイルを作成します。

以下を参考にして、CloudSearchの検索対象としたいドキュメントファイル(CloudSearchインデックスの元データ)を作成します。

https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/preparing-data.html

json形式のドキュメントファイルを作成します。

```
[ec2-user@example-cloudsearch-client ~]$ vi example_document.json
```

```json:example_document.json
{ "type": "add",
  "id":   "tt0484562",
  "fields": {
    "title": "The Seeker: The Dark Is Rising",
    "directors": ["Cunningham, David L."],
    "genres": ["Adventure","Drama","Fantasy","Thriller"],
    "actors": ["McShane, Ian","Eccleston, Christopher","Conroy, Frances",
              "Crewson, Wendy","Ludwig, Alexander","Cosmo, James",
              "Warner, Amelia","Hickey, John Benjamin","Piddock, Jim",
              "Lockhart, Emma"]
  }
}
```

jqコマンドをインストールして、作成したドキュメントファイルがjsonとして有効かチェックします。

```
[ec2-user@example-cloudsearch-client ~]$ sudo yum install jq
```

```
[ec2-user@example-cloudsearch-client ~]$ cat example_document.json | jq '.'
{
  "type": "add",
  "id": "tt0484562",
  "fields": {
    "title": "The Seeker: The Dark Is Rising",
    "directors": [
      "Cunningham, David L."
    ],
    "genres": [
      "Adventure",
      "Drama",
      "Fantasy",
      "Thriller"
    ],
    "actors": [
      "McShane, Ian",
      "Eccleston, Christopher",
      "Conroy, Frances",
      "Crewson, Wendy",
      "Ludwig, Alexander",
      "Cosmo, James",
      "Warner, Amelia",
      "Hickey, John Benjamin",
      "Piddock, Jim",
      "Lockhart, Emma"
    ]
  }
}
[ec2-user@example-cloudsearch-client ~]$
```

## (5) CloudSearch検索用ドキュメントファイルを格納するAmazon S3バケットを作成します。

AWSマネジメントコンソールの「S3」をクリックします。

https://console.aws.amazon.com/s3/home?region=ap-northeast-1

「バケットを作成」をクリックします。今回の例では以下のS3バケット( s3://example-search-document )を作成します。

| 設定項目 | 入力する内容 |
|---------|-------------|
| バケット名 | example-search-document |
| リージョン | Tokyo |　

## (6) S3バケットに作成したCloudSearch検索用ドキュメントファイルをアップロードします。

作成したS3バケットに対して、前述の手順(4)で作成したCloudSearch検索用ドキュメントファイルをアップロードします。

```
[ec2-user@example-cloudsearch-client ~]$ aws s3 cp example_document.json s3://example-search-document/document/
upload: ./example_document.json to s3://example-search-document/document/example_document.json
[ec2-user@example-cloudsearch-client ~]$
```

```
[ec2-user@example-cloudsearch-client ~]$ aws s3 ls s3://example-search-document/document/example_document.json
2016-09-25 01:08:53        452 example_document.json
[ec2-user@example-cloudsearch-client ~]$
```

## (7) 作成するCloudSearch検索ドメイン情報を入力します。

「Create New Search Domain」の「NAME YOUR DOMAIN」画面が表示されます。
今回の例では以下のように入力します。

| 設定項目 | 入力する内容 |
|---------|-------------|
| Search Domain Name | example-search-domain |
| Desired Instance Type | Use default |
| Desired Replication Count | Use default |

「Continue」をクリックします。

## (8) CloudSearch検索用ドキュメントファイルの格納場所を指定します。

「CONFIGURE INDEX」画面が表示されます。

「How do you want to configure your index fields?」と表示されます。

「Analyze sample object(s) from Amazon S3」を選択します。S3の各設定項目については以下を選択します。

| 設定項目 | 選択する内容 |
|---------|-------------|
| S3 Bucket | example-search-document | 
| Prefix | document/example_document.json |

「Add」をクリックします。

「Continue」をクリックします。

## (9) CloudSearchで検索するフィールドのインデックスを追加します。

「REVIEW INDEX CONFIGURATION」画面が表示されます。

「Suggested Index Field Configuration」と表示されます。

「Add Index Field」をクリックして、検索用インデックスに以下3つのフィールドを追加します。「Type」は「Text」、「Analysis Scheme」は「Eng」を選択してフィールドを追加します。

| 追加するIndex Fields | Type  | Analysis Scheme  |
|---------------------|-------|------------------|
| directors           | Text  | Eng |
| genres              | Text  | Eng |
| actors              | Text  | Eng |

上記のフィールドを追加し、「Index Fields」を以下のように設定したら「Continue」をクリックします。



これにより、CloudSearchは前述(4)でS3バケットに格納したドキュメントファイル(json)を取り込んで、検索用のデータ(インデックス)が作成されます。

| Name | Type | Search | Facet | Return | Sort | Highlight | Analysis Scheme | Default Value | Source Field | Remove |
|------|------|--------|-------|--------|------|-----------|---------------------|---------------|--------------|--------|
| content | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |
| content_encoding | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |
| content_type | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |
| resourcename | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |
| directors | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |
| genres | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |
| actors | Text | | チェックをつける | チェックをつける | チェックをつける | チェックをつける | Eng | | | |

## (10) CloudSearch検索ドメインに対するアクセス許可を設定します。

今回の例では特定IPアドレス(例:198.51.100.13)からのみCloudSearchのデータ検索を許可します。
この設定により、特定IPアドレス(例:198.51.100.13)以外からCloudSearch検索ドメインへ検索リクエストを送る事を禁止出来ます。

「SETUP ACCESS POLICIES」画面が表示されます。

「Current Policy」に以下のように入力します。

```json:入力するPolicy内容
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"search_only",
      "Effect":"Allow",
      "Principal":"*",
      "Action":["cloudsearch:search"],
      "Condition":{"IpAddress":{"aws:SourceIp":"198.51.100.13/32"}}
    }
  ]
}
```

「Continue」をクリックします。

## (11) CloudSearch検索ドメインの作成を開始します。

「CONFIRM」画面が表示されます。
「Continue」をクリックします。

## (12) CloudSearch検索ドメインの作成が完了するまで待ちます。

AWSマネジメントコンソールに以下のメッセージが表示されます。

```
Congratulations
You have successfully created the domain example-search-domain. The domain will take approximately 10 minutes to initialize. Once the domain is initialized, you may upload documents, and make any other changes to the domain.
```

AWSマネジメントコンソール右下の「OK」をクリックします。

AWSマネジメントコンソールの「CloudSearch」->「Dashboard」画面へ切り替わります。

https://ap-northeast-1.console.aws.amazon.com/cloudsearch/home?region=ap-northeast-1#domainDashboard,example-search-domain

CloudSearch検索ドメインの作成が完了するまで待ちます。

## (13) CloudSearch検索ドメインの作成が完了した事を確認します。

AWSマネジメントコンソールの「CloudSearch」->「Dashboard」を確認します。

https://ap-northeast-1.console.aws.amazon.com/cloudsearch/home?region=ap-northeast-1#domainDashboard,example-search-domain

「Domain Status for example-search-domain」に「example-search-domain is: ACTIVE」と表示されている事を確認します。

「Dashboard」の「Search Endpoint」のCloudSearch検索ドメイン名を控えておきます。この「Search Endpoint」の検索ドメインを指定して、CloudSearchに登録したデータを検索出来ます。詳細は後述します。

```
Searchable Documents:	1
Index Fields:	7
Search Endpoint:	search-example-search-domain-**************************.ap-northeast-1.cloudsearch.amazonaws.com
Document Endpoint:	doc-example-search-domain-**************************.ap-northeast-1.cloudsearch.amazonaws.com
Domain ARN:	arn:aws:cloudsearch:ap-northeast-1:464959028036:domain/example-search-domain
Engine Type:	CloudSearch (2013 API)
```

## (14) CloudSearchのデータを検索を実行します。

キーワードを指定してCloudSearchからデータを検索します。

前述(13)の「Search Endpoint」に表示されているCloudSearch検索ドメイン名を指定して、データを検索します。

CloudSearch検索ドメイン例

```
search-example-search-domain-**************************.ap-northeast-1.cloudsearch.amazonaws.com
```

CloudSearchのデータ検索については、CloudSearch検索ドメインへのアクセスを許可したIPアドレス(198.51.100.13/32)から以下の検索リクエストを送信する事で実行します。

```
[ec2-user@example-cloudsearch-client ~]$ /sbin/ifconfig eth0 | grep 'inet addr'
          inet addr:198.51.100.13  Bcast:198.51.100.255  Mask:255.255.240.0
[ec2-user@example-cloudsearch-client ~]$
```

### (14-1) CloudSearchから'McShane'という文字列が含まれているデータを検索します。

以下のコマンドを実行し、CloudSearchから'McShane'という文字列が含まれているデータを検索します。

CloudSearch検索ドメインへ正常にアクセス出来る場合、以下のようにCloudSarchからの検索レスポンスの「Hit」に検索結果が表示されます。

前述(4)でS3バケットに格納したドキュメントファイル(s3://example-search-document/document/example_document.json)を元にして、CloudSearch検索用のインデックスを作成しているので、検索結果には以下のように表示されています。

```
[ec2-user@example-cloudsearch-client ~]$ aws cloudsearchdomain --region ap-northeast-1 --endpoint-url http://search-example-search-domain-**************************.ap-northeast-1.cloudsearch.amazonaws.com search --search-query McShane
{
    "status": {
        "timems": 1,
        "rid": "jr+w6/UqlAEKeR92"
    },
    "hits": {
        "found": 1,
        "hit": [
            {
                "fields": {
                    "content": [
                        "{ \"type\": \"add\",   \"id\":   \"tt0484562\",   \"fields\": {     \"title\": \"The Seeker: The Dark Is Rising\",     \"directors\": [\"Cunningham, David L.\"],     \"genres\": [\"Adventure\",\"Drama\",\"Fantasy\",\"Thriller\"],     \"actors\": [\"McShane, Ian\",\"Eccleston, Christopher\",\"Conroy, Frances\",               \"Crewson, Wendy\",\"Ludwig, Alexander\",\"Cosmo, James\",               \"Warner, Amelia\",\"Hickey, John Benjamin\",\"Piddock, Jim\",               \"Lockhart, Emma\"]   } }"
                    ],
                    "resourcename": [
                        "example_document.json"
                    ],
                    "content_encoding": [
                        "ISO-8859-1"
                    ],
                    "content_type": [
                        "application/json"
                    ]
                },
                "id": "example-search-document/document/example_document.json"
            }
        ],
        "start": 0
    }
}
[ec2-user@example-cloudsearch-client ~]$
```

### (14-2) CloudSearchからactoresフィールドに'McShane'という文字列が含まれているデータを検索します。

以下のコマンドを実行し、CloudSearchからactoresフィールドに'McShane'という文字列が含まれているデータを検索します。

```
[ec2-user@example-cloudsearch-client ~]$ aws cloudsearchdomain --region ap-northeast-1 --endpoint-url http://search-example-search-domain-**************************.ap-northeast-1.cloudsearch.amazonaws.com search --search-query "actores:'McShane'"
{
    "status": {
        "timems": 5,
        "rid": "nZCy6/UqlgEKeR92"
    },
    "hits": {
        "found": 1,
        "hit": [
            {
                "fields": {
                    "content": [
                        "{ \"type\": \"add\",   \"id\":   \"tt0484562\",   \"fields\": {     \"title\": \"The Seeker: The Dark Is Rising\",     \"directors\": [\"Cunningham, David L.\"],     \"genres\": [\"Adventure\",\"Drama\",\"Fantasy\",\"Thriller\"],     \"actors\": [\"McShane, Ian\",\"Eccleston, Christopher\",\"Conroy, Frances\",               \"Crewson, Wendy\",\"Ludwig, Alexander\",\"Cosmo, James\",               \"Warner, Amelia\",\"Hickey, John Benjamin\",\"Piddock, Jim\",               \"Lockhart, Emma\"]   } }"
                    ],
                    "resourcename": [
                        "example_document.json"
                    ],
                    "content_encoding": [
                        "ISO-8859-1"
                    ],
                    "content_type": [
                        "application/json"
                    ]
                },
                "id": "example-search-document/document/example_document.json"
            }
        ],
        "start": 0
    }
}
[ec2-user@example-cloudsearch-client ~]$
```

```
[ec2-user@example-cloudsearch-client ~]$ aws cloudsearchdomain --region ap-northeast-1 --endpoint-url http://search-example-search-domain-**************************.ap-northeast-1.cloudsearch.amazonaws.com search --search-query "actores:'McShane'" --return _no_fields
{
    "status": {
        "timems": 42,
        "rid": "lfve6vUqbgp5H3Y="
    },
    "hits": {
        "found": 1,
        "hit": [
            {
                "id": "example-search-document/document/example_document.json"
            }
        ],
        "start": 0
    }
}
[ec2-user@example-cloudsearch-client ~]$
```

***

以上になります。