【連載】Amazon CloudSearchのCLI入門編 ＃3 （ドキュメントの検索）

# １．概要
担当システムのAWS化に合わせて、提供している検索エンジンをCloudSearchに置き換える事になりました。
検証するために、CLI（コマンドラインインターフェイス）経由でCloudSearchを操作したので、
その手順をまとめて残したいと思います。
※ほぼ、既知の内容と思いますが、ご了承下さい。

# ２．前回までの記事
[【連載】Amazon CloudSearchのCLI入門編 ＃1 （検索ドメインの作成）](http://qiita.com/koutaku921/items/ee2e2af1fe05ab5ca6c4)
[【連載】Amazon CloudSearchのCLI入門編 ＃2 （ドキュメントの登録）](http://qiita.com/koutaku921/items/e6e1e8fd36217b8c9854)

# ３．前提条件（再掲）

クライアントは、Windows環境です。CLIのコマンドは同じなので、他のコマンドは、環境に合わせて、
適宜読みかえて下さい。あと、アクセスキーとシークレットキーを発行してCloudSearchへ接続します。
今回、準備する検索ドメインは、以下の通りとなります。

|フィールド名|型|
|:--:|:--:|
|id|literal|
|artist_name_li|literal|
|album_title_li|literal|
|artist_name_te|text|
|album_title_te|text|
※ 検証内容がliteral型とtext型のscore値の確認だったため、それぞれの検索フィードを定義しました。
※ その他、使える型は、以下のURLを参考にして下さい。
　 参考URL：[公式：Amazon CloudSearch ドメインのインデックスフィールドの設定](https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/configuring-index-fields.html)

# ４．使用するクエリパーサー
CloudSearchでは、４つのクエリパーサーをサポートしています。
今回は、「structured」を使用した検索クエリーを利用します。

|クエリパーサー|概要|
|:--:|:--|
|simple|指定された文字列をすべての text および text-array フィールドで検索します。|
|structured |特定のフィールドの検索、ブール演算子を使用した複合クエリの作成、および用語の増強や近接検索などの高度な機能を使用することができます。|
|lucene|Apache Lucene クエリパーサーの構文を使用して、検索条件を指定します。|
|dismax|DisMax のクエリパーサーで定義された Apache Lucene のクエリパーサー構文の簡略化されたサブセットを使用して、検索条件を指定します。|

　参考URL：[公式；Amazon CloudSearch でのデータの検索](http://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/searching.html)

# ５．ドキュメントの検索

以下のコマンドを実行して、ドキュメントを検索します。

## １．text型フィールドの指定

```
aws cloudsearchdomain search --endpoint-url https://search-search-score-test-yamamoto-aaaaaaaaaaaaaaaaaaaaaaaaaa.ap-northeast-1.cloudsearch.amazonaws.com^
    --query-parser structured^
    --search-query "artist_name_te:'アーティスト'"^
    --return "id,artist_name_te,_score"^
    --start 0^
    --size 10^
    --sort "_score desc, id desc"

{
    "status": {
        "timems": 1,
        "rid": "2YSSv7Qrz5EECn6ufA=="
    },
    "hits": {
        "found": 2,
        "hit": [
            {
                "fields": {
                    "_score": [
                        "2.541985"
                    ],
                    "artist_name_te": [
                        "アーティスト001"
                    ]
                },
                "id": "6"
            },
            {
                "fields": {
                    "_score": [
                        "2.541985"
                    ],
                    "artist_name_te": [
                        "アーティスト001"
                    ]
                },
                "id": "7"
            }
        ],
        "start": 0
    }
}

```
上記の指定により、
「artist_name_te」に"アーティスト"を保持するドキュメントが検索されます。

|パラメタ|説明|
|:--|:--|
|--query-parser|使用するクエリーパーサーを指定します。|
|--search-query|検索するクエリーを指定します。"フィールド名:キーワード"で指定します。|
|--return |返却するフィードを指定します。|
|-start|データの取得開始位置を指定します。|
|--size|データの取得件数を指定します。|


## ２．literal型フィールドへの指定
```
aws cloudsearchdomain search --endpoint-url https://search-search-score-test-yamamoto-aaaaaaaaaaaaaaaaaaaaaaaaaa.ap-northeast-1.cloudsearch.amazonaws.com^
    --query-parser structured^
    --search-query "(and(prefix field=artist_name_li 'アーティスト')(term field=album_title_li '君繋ぎファイブM'))"^
    --return "id,artist_name_li,album_title_li,_score"^
    --start 0^
    --size 10^
    --sort "_score desc, id desc"

{
    "status": {
        "timems": 2,
        "rid": "56P8vrQryJEECn6ufA=="
    },
    "hits": {
        "found": 1,
        "hit": [
            {
                "fields": {
                    "_score": [
                        "2.6739764"
                    ],
                    "album_title_li": [
                        "君繋ぎファイブM"
                    ],
                    "artist_name_li": [
                        "アーティスト001"
                    ]
                },
                "id": "6"
            }
        ],
        "start": 0
    }
}
```

上記の指定により、
「artist_name_li」に"アーティス"で前方一致する文字がある、かつ、
「album_title_li」に"君繋ぎファイブM"で完全一致する文字がある
ドキュメントが検索されます。

|パラメタ|説明|
|:--|:--|
|--search-query|"フィード名=キーワード"とブール演算子で指定します。|
|prefix|キーワードを前方一致で検索します。|
|term|キーワードを完全一致で検索します。|

　※参考URL：[公式：Amazon CloudSearch での複合クエリの作成](http://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/searching-compound-queries.html)

# ６．最後に
入門編は、最終回となります。
機会があれば、応用編として、より複雑な検索方法に関して、記載したいと思います。
ありがとうございました。