

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon CloudSearch でのデータの検索
<a name="searching"></a>

検索する用語または値を `q` パラメータを使用して指定します。検索条件の指定方法は、使用するクエリパーサーによって異なります。​ Amazon CloudSearch は、次の 4 つのクエリパーサーをサポートしています。
+ `simple` — 指定された文字列をすべての `text` および `text-array` フィールドで検索します。簡易クエリパーサーでは、フレーズ、個々の用語、プレフィックスを検索することができます。必須またはオプションとして用語を指定することも、特定の用語を含む一致を除外することもできます。特定のフィールドを検索するには、`q.options` パラメータで検索するフィールドを指定できます。`simple` クエリパーサーは、`q.parser` パラメータが指定されない場合にデフォルトで使用されます。
+ `structured` — 特定のフィールドの検索、ブール演算子を使用した複合クエリの作成、および用語の増強や近接検索などの高度な機能を使用することができます。
+ `lucene` — Apache Lucene クエリパーサーの構文を使用して、検索条件を指定します。現在 Lucene 構文を使用している場合は、`lucene` クエリパーサーを使用することで、検索クエリを Amazon CloudSearch 構造化検索構文で完全に書き換えなくても、検索サービスを Amazon CloudSearch ドメインに移行することができます。
+ `dismax` — DisMax のクエリパーサーで定義された Apache Lucene のクエリパーサー構文の簡略化されたサブセットを使用して、検索条件を指定します。現在 DisMax 構文を使用している場合は、`dismax` クエリパーサーを使用することで、検索クエリを Amazon CloudSearch 構造化検索構文で完全に書き換えなくても、検索サービスを Amazon CloudSearch ドメインに移行することができます。

追加の検索パラメータを使用して、[検索結果の返し方を制御](controlling-search-results.md)したり、検索結果にファセット、強調表示、候補などの[追加情報を含める](querying-for-more-info.md)ことができます。

すべての Amazon CloudSearch 検索パラメータの詳細については、「[検索 API リファレンス](search-api.md)」を参照してください。

**Topics**
+ [Amazon CloudSearch ドメインへの検索リクエストの送信](submitting-search-requests.md)
+ [Amazon CloudSearch での複合クエリの作成](searching-compound-queries.md)
+ [text](searching-text.md)
+ [Amazon CloudSearch での数値の検索](searching-numbers.md)
+ [Amazon CloudSearch での日付と時刻の検索](searching-dates.md)
+ [Amazon CloudSearch での値の範囲の検索](searching-ranges.md)
+ [location-based searching and sorting](searching-locations.md)
+ [Amazon CloudSearch による DynamoDB データの検索](searching-dynamodb-data.md)
+ [Amazon CloudSearch での一致するドキュメントのフィルタリング](filtering-results.md)
+ [Amazon CloudSearch での検索リクエストのパフォーマンスのチューニング](tuning-search.md)

# Amazon CloudSearch ドメインへの検索リクエストの送信
<a name="submitting-search-requests"></a>

検索リクエストを送信するには、AWS SDKs のいずれかまたは AWS CLI を使用することをお勧めします。SDKsと はリクエスト署名 AWS CLI を処理し、すべての Amazon CloudSearch アクションを実行する簡単な方法を提供します。Amazon CloudSearch コンソールの検索テスターを使用して、データの検索、結果の参照、生成されたリクエスト URL、JSON および XML レスポンスの表示を行うことができます。詳細については、「[検索テスターによる検索](getting-started-search.md#searching-console)」を参照してください。

**重要**  
検索エンドポイントは変わりません。ドメインのドキュメントエンドポイントと検索エンドポイントは、ドメインが存在している間変わりません。すべてのアップロードリクエストや検索リクエストの前にエンドポイントを取得するのではなく、エンドポイントをキャッシュに保存してください。各リクエストの前に `aws cloudsearch describe-domains` または `DescribeDomains` を呼び出すことによって Amazon CloudSearch 設定サービスにクエリを実行すると、リクエストが調整される可能性があります。
IP アドレスは**変わります**。ドメインの IP アドレスは、時間の経過とともに*変化する*ので、コンソールに表示されるようにエンドポイントをキャッシュし、IP アドレスではなく、`aws cloudsearch describe-domains` コマンドによって返されるようにすることが重要です。また、エンドポイント DNS を IP アドレスに定期的に再解決する必要があります。詳細については、[「DNS 名参照用の JVM TTL の設定」](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-jvm-ttl.html)を参照してください。

例えば、次のリクエストは、 `wolverine`を使用して の簡単なテキスト検索を送信 AWS CLI し、一致するドキュメントの IDs のみを返します。

```
aws cloudsearchdomain --endpoint-url http://search-movies-y6gelr4lv3jeu4rvoelunxsl2e.us-east-1.cloudsearch.amazonaws.com search --search-query wolverine  --return _no_fields
{
    "status": {
        "rid": "/rnE+e4oCAqfEEs=", 
        "time-ms": 6
    }, 
    "hits": {
        "found": 3, 
        "hit": [
            {
                "id": "tt1430132"
            }, 
            {
                "id": "tt0458525"
            }, 
            {
                "id": "tt1877832"
            }
        ], 
        "start": 0
    }
}
```

デフォルトでは、Amazon CloudSearch は JSON 形式でレスポンスを返します。`format` パラメータを指定して、結果を XML 形式で取得できます。レスポンス形式の設定は、成功したリクエストのレスポンスのみに影響します。エラーレスポンスの形式は、エラーの発生元によって異なります。検索サービスによって返されるエラーは、常に JSON 形式で返されます。サーバーのタイムアウトと他のリクエストのルーティングの問題による 5xx エラーは XML 形式で返されます。

**注記**  
AWS SDK はフィールドを配列として返します。単一値フィールドは、次のような 1 つの要素を持つ配列として返されます。  

```
"fields": {
  "plot": ["Katniss Everdeen reluctantly becomes the symbol of a mass rebellion against the autocratic Capitol."]
}
```

開発およびテストの目的では、ドメインの検索サービスへの匿名アクセスを許可し、署名のない HTTP GET または POST リクエストをドメインの検索エンドポイントに直接送信できます。実稼働環境では、ドメインへのアクセスを特定の IAM ロール、グループ、またはユーザーに制限し、AWS SDK または AWS CLIを使用して署名付きリクエストを送信します。Amazon CloudSearch のアクセス制御の詳細については、「[Amazon CloudSearch のアクセスの設定](configuring-access.md)」を参照してください。リクエストの署名の詳細については、「[AWS API リクエストの署名](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)」を参照してください。

HTTP リクエストをドメインの検索エンドポイントに直接送信する任意のメソッドを使用できます。ウェブブラウザにリクエスト URL を直接入力したり、cURL を使用してリクエストを送信したり、お気に入りの HTTP ライブラリを使用して HTTP 呼び出しを生成したりできます。検索条件を指定するには、検索の制約とレスポンスで戻す内容を指定するクエリ文字列を指定します。クエリ文字列は、URL エンコードされている必要があります。GET 経由で送信される検索リクエストの最大サイズは、HTTP メソッド、URI、プロトコルのバージョンを含め 8190 バイトです。HTTP POST を使用してより大きなリクエストを送信できますが、大規模で複雑なリクエストの処理には時間がかかり、タイムアウトになる可能性が高くなることに注意してください。詳細については、「[Amazon CloudSearch での検索リクエストのパフォーマンスのチューニング](tuning-search.md)」を参照してください。

例えば、次のリクエストは、構造化クエリを `search-movies-rr2f34ofg56xneuemujamut52i.us-east-1.cloudsearch.amazonaws.com` ドメインに送信し、`title` フィールドのコンテンツを取得します。

```
http://search-movies-rr2f34ofg56xneuemujamut52i.us-east-1.cloudsearch.
amazonaws.com/2013-01-01/search?q=(and+(term+field%3Dtitle+'star')
(term+field%3Dyear+1977))&q.parser=structured&return=title
```

**重要**  
クエリ文字列の特殊文字は、URL エンコードする必要があります。例えば、構造化クエリ内の `=` 演算子は、`%3D`: `(term+field%3Dtitle+'star')` としてエンコードする必要があります。検索リクエストの送信時に特殊文字をエンコードしないと、`InvalidQueryString` というエラーが表示されます。

# 検索テスターによる検索
<a name="search-tester"></a>

Amazon CloudSearch コンソールの検索テスターを使用すると、サポートされているクエリパーサー (簡易、構造化、lucene、または dismax) を使用して、サンプル検索リクエストを送信できます。デフォルトでは、リクエストは簡易クエリパーサーで処理されます。選択したパーサーのオプションを指定したり、結果をフィルタリングしてソートしたり、構成されたファセットを参照したりできます。検索結果では、検索ヒットが自動的にハイライトされます。これを行う方法の詳細については、「[Amazon CloudSearch での検索ヒットのハイライト](highlighting.md)」を参照してください。また、サジェスタを選択して、**[Search]** (検索) フィールドに用語を入力するときに、候補を取得することもできます。(候補を取得する前に、サジェスタを設定する必要があります。 詳細については、「[Amazon CloudSearch でのオートコンプリート候補の取得](getting-suggestions.md)」を参照してください。）

デフォルトでは、自動的に生成された関連性スコア * \$1score* に従って結果がソートされます。結果のランク付け方法のカスタマイズについては、「[Amazon CloudSearch での結果のソート](sorting-results.md)」を参照してください。



**ドメインを検索するには**

1. Amazon CloudSearch コンソール ([https://console.aws.amazon.com/cloudsearch/home](https://console.aws.amazon.com/cloudsearch/home)) に移動します。

1. 左側のナビゲーションパネルでドメイン名を選択し、設定を開きます。

1. **[テスト検索を実行]** を選択します。

1. 単純なテキスト検索を実行するには、検索クエリを入力して **[実行]** を選択します。デフォルトでは、すべての `text` および `text-array` フィールドが検索されます。

特定のフィールドを検索するには、**[オプション]** を展開し、**[検索フィールド]** に検索したいフィールドのリストをカンマ区切りで入力します。キャレット (^) を使用して各フィールドの重みを追加すると、検索結果の各フィールドの相対的な重要度を制御できます。例えば、一致する各ドキュメントの関連性スコアを計算するときに、`title^5, description` フィールドのヒット数よりも 5 倍多い `title` 重量ヒットを `description` フィールドで指定するなどです。

構造化クエリ構文を使用するには、**[クエリパーサー]** メニューから **[構造化]** を選択します。構造化クエリパーサーを選択したら、**[検索]** フィールドに構造化クエリを入力して **[実行]** を選択します。例えば、2000 年以前にリリースされたタイトルに *star* のあるすべての映画を見つけるには、`(and title:'star' year:{,2000])` を入力します。詳細については、「[複合クエリの作成](searching-compound-queries.md)」を参照してください。Lucene または DisMax クエリを送信するには、適切なクエリパーサーを選択します。

選択したクエリパーサーに追加オプションを指定して、デフォルトの演算子を設定し、クエリで使用できる演算子を制御できます。詳細については、「[検索リクエストのパラメータ](search-api.md#search-request-parameters)」を参照してください。

リクエスト URL をコピーして貼り付けて、リクエストを送信し、ウェブブラウザからレスポンスを表示できます。リクエストは HTTP または HTTPS 経由で送信できます。

# Amazon CloudSearch での複合クエリの作成
<a name="searching-compound-queries"></a>

structured クエリパーサーを使用すると、ブール演算子 `and`、`or`、`not` で一致式を結合することができます。structured クエリパーサーを選択するには、クエリに `q.parser=structured` を含めます。構造化クエリ演算子は、*prefix* 演算子として指定されます。構文は次のとおりです。
+ `(and boost=N EXPRESSION1 EXPRESSION2 ... EXPRESSIONn)`
+ `(or boost=N EXPRESSION1 EXPRESSION2 ... EXPRESSIONn)`
+ `(not boost=N EXPRESSION)`

例えば、次のクエリは、サンプルデータセット内でタイトルに *star* が含まれ、`actors` フィールドに Harrison Ford または William Shatner のいずれかの名前があり、Zachary Quinto の名前のないすべての映画と一致します。

```
(and title:'star' (or actors:'Harrison Ford' actors:'William Shatner')(not actors:'Zachary Quinto'))
```

構造化クエリ演算子を使用するときは、演算子の名前、演算子のオプション、および操作対象の一致式を `(OPERATOR OPTIONS EXPRESSION)` のように指定します。一致式には、単純な文字列または複合クエリのサブクラスを使用できます。オプションは語句の前に指定する必要があります。例えば、`(and (not field=genres 'Sci-Fi')(or (term field=title boost=2 'star')(term field=plot 'star')))` と指定します。

式の評価の順番は、括弧で制御します。式を括弧で囲んだ場合、その式が最初に評価され、その結果の値が複合クエリの残り部分の評価に使用されます。

**重要**  
クエリ文字列の特殊文字は、URL エンコードする必要があります。例えば、構造化クエリでの `=` 演算子は、`%3D`: `(term+field%3Dtitle+'star'` としてエンコードする必要があります。) Amazon CloudSearch では、特殊文字が URL エンコードされていないと `InvalidQueryString` エラーになります。URL エンコードの詳細については、W3C の[「HTML URL エンコードリファレンス」](http://www.w3schools.com/tags/ref_urlencode.asp)を参照してください。

例えば、次のクエリは `title` フィールドを検索対象として語句 `star wars` を検索し、`year` フィールドの値が 2000 より小さいものを除外します。

```
(and (phrase field='title' 'star wars') (not (range field=year {,2000})))
```

この検索リクエストを送信するには、クエリ文字列をエンコードして、`structured` パラメータをつけた `q.parser` クエリパーサーを指定します。

```
http://search-movies-rr2f34ofg56xneuemujamut52i.us-east-1.cloudsearch.
amazonaws.com/2013-01-01/search?q=(and+(phrase+field='title'+'star wars')+(not+(range+field%3Dyear+{,2000})))&q.parser=structured
```

構造化クエリの構文を使用すると、複数のフィールドに対する検索を結合できます。検索するフィールドを指定しない場合は、すべての `text` および `text-array` フィールドが検索されます。例えば、次のクエリでは、すべての `text` および `text-array` フィールドで用語 *star (主役)* を検索し、`actors` フィールドで *Zachary Quinto (ザカリー・クイント)* を含むドキュメントは除外されます。

```
(and 'star' (not actors:'Zachary Quinto'))
```

`boost` 値を指定して、複合クエリのある式の重要度を他より高くすることができます。boost 値は一致ドキュメントのスコアを高くします。例えば、次のクエリでは、*star* という用語が `description` フィールドではなく `title` フィールドに存在している場合、一致の重要度が高くなります。

```
(and (range field=year [2013,}) (or (term field=title boost=2 'star') (term field=plot 'star')) 
```

Boost 値は 0 より大きくする必要があります。

`and`、`or`、`not` に加えて、Amazon CloudSearch 構造化検索構文ではいくつかの専門演算子がサポートされています。
+ `matchall` — ドメイン内のすべてのドキュメントが一致します。構文: `matchall`。
+ `near` — あいまいフレーズクエリをサポート。`distance` 値には、フレーズ内の単語を分割できる単語の最大数を指定します。例えば、`(near field='plot' distance=4 'naval mutiny demonstration')` のようにします。`near` 演算子を使用すると、指定した用語がごく近接していますが、隣接してはいないときに一致します。あいまいフレーズ検索の詳細については、「[フレーズの検索](searching-text.md#searching-text-phrases)」を参照してください。構文: `(near field=FIELD distance=N boost=N 'STRING')`。
+ `phrase` — `text` または `text-array` フィールドでのフレーズの検索。例えば、`(phrase field="title" 'teenage mutant ninja')` です。式に一致するドキュメントの増強をサポートします。フレーズ検索の詳細については、「[フレーズの検索](searching-text.md#searching-text-phrases)」を参照してください。構文: `(phrase field=FIELD boost=N 'STRING')`。
+ `prefix` — テキスト、テキスト配列、リテラル、リテラル配列フィールドで指定されたプレフィックス単独またはその後に文字が続くものを検索します。例えば、 となります。`(prefix field='title' 'wait')`式に一致するドキュメントの増強をサポートします。プレフィックス検索の詳細については、「[プレフィックスの検索](searching-text.md#searching-text-prefixes).構文: `(prefix field=FIELD boost=N 'STRING')`」を参照してください。
+ `range` — 数値フィールドで値の範囲を検索。例: `(range field=year [2000,2013])`。範囲検索の詳細については、「[値の範囲の検索](searching-ranges.md)」を参照してください。構文: `(range field=FIELD boost=N RANGE)`。
+ `term` — 任意のフィールドで個々の用語または値を検索。例: `(and (term field=title 'star')(term field=year 1977))`。構文: `(term field=FIELD boost=N 'STRING'|VALUE)`。

特定のデータタイプの検索の詳細については、次のセクションを参照してください。構造化検索構文の詳細については、「[構造化検索構文](search-api.md#structured-search-syntax)」を参照してください。

# Amazon CloudSearch でのテキストの検索
<a name="searching-text"></a>

テキストとリテラルの両方のフィールドで、テキスト文字列を検索できます。
+ `Text` および `text-array` フィールドは、常に検索可能です。個々の用語だけでなくフレーズも検索できます。`text` および `text-array` フィールド内の検索では、大文字と小文字は区別されません。
+ `Literal` および `literal-array` フィールドは、ドメインのインデックスオプションで検索を有効にしている場合のみ検索できます。検索文字列の完全一致を検索することができます。リテラルフィールドの検索では、大文字/小文字が区別されます。

簡単なクエリパーサーを使用する場合、または構造化クエリパーサーで検索時にフィールドを指定しない場合、デフォルトではすべての `text` および `text-array` フィールドが検索されます。リテラルフィールドはデフォルトでは検索*されません*。`q.options` パラメータを使用して、検索するフィールドを指定できます。

ユニークなドキュメント ID フィールドを、他のテキストフィールドと同様に検索できます。検索リクエストでドキュメント ID フィールドを参照するには、フィールド名 `_id` を使用します。ドキュメント ID は、必ず検索結果で返されます。

**Topics**
+ [Amazon CloudSearch での個々の用語の検索](#searching-text-terms)
+ [Amazon CloudSearch でのフレーズの検索](#searching-text-phrases)
+ [Amazon CloudSearch でのリテラル文字列の検索](#searching-text-literals)
+ [Amazon CloudSearch でのプレフィックスの検索](#searching-text-prefixes)

## Amazon CloudSearch での個々の用語の検索
<a name="searching-text-terms"></a>

`text` および `text-array` フィールドで個々の用語を検索すると、Amazon CloudSearch は指定されたフィールド内のどこかに検索する用語が含まれているすべてのドキュメントを任意の順序で見つけます。例えば、サンプルの映画データで、`title` フィールドは `text` フィールドとして設定されています。`title` フィールドで *star* を検索すると、*star*、*star wars*、*a star is born* など、`title` フィールドで *star* が含まれているすべての映画が見つかります。これは、一致と見なされるにはフィールド値が検索文字列と完全に一致している必要がある `literal` フィールドの検索とは異なります。

`simple` クエリパーサーでは、`text` および `text-array` フィールドで 1 つ以上の用語を簡単に検索できます。`q.parser` パラメータを使用して他のクエリパーサーを指定しなければ、デフォルトで `simple` クエリパーサーが使用されます。

例えば、*katniss* を検索するには、クエリ文字列に `katniss` と指定します。デフォルトでは、Amazon CloudSearch は検索結果に値を返すことが可能なすべてのフィールドを含めます。`return` パラメータを設定して、返す必要のあるフィールドを指定できます。

```
https://search-domainname-domainid.us-east-1.cloudsearch.amazonaws.com/
2013-01-01/search?q=katniss&return=title
```

デフォルトでは、レスポンスは JSON で返されます。

```
{
    "status": {
        "rid": "rd+5+r0oMAo6swY=",
        "time-ms": 9
    },
    "hits": {
        "found": 3,
        "start": 0,
        "hit": [
            {
                "id": "tt1951265",
                "fields": {
                    "title": "The Hunger Games: Mockingjay - Part 1"
                }
            },
            {
                "id": "tt1951264",
                "fields": {
                    "title": "The Hunger Games: Catching Fire"
                }
            },
            {
                "id": "tt1392170",
                "fields": {
                    "title": "The Hunger Games"
                }
            }
        ]
    }
}
```

複数の用語を指定するには、用語をスペースで区切ります。例: `star wars`。複数の検索用語を指定するときは、デフォルトで、一致と見なされるすべての用語がドキュメントに含まれている必要があります。用語は、テキストフィールド内の任意の場所で、任意の順序で出現する可能性があります。

デフォルトでは、簡易クエリパーサーを使用すると、すべての `text` および `text-array` フィールドが検索されます。`q.options` パラメータを指定することで、検索するフィールドを指定できます。例えば、このクエリでは、`title` および `description` フィールドに検索を制限し、`title` フィールドでの一致の重要度を `description` フィールドでの一致より高く設定します。

```
q=star wars&q.options={fields: ['title^5','description']}
```

簡易クエリパーサーを使用する場合は、次のプレフィックスを使用して、個々の用語を必須またはオプションとして指定したり、検索結果から除外するように指定できます。
+ **`+`** — 一致するドキュメントは用語を含んでいる必要があります。これがデフォルトです。用語をスペースで区切ることは、`+` プレフィックスをその前に付けるのと同じです。
+ **`-`** — 用語を含むドキュメントを検索結果から除外します。`-` 演算子は、個々の用語にのみ適用されます。例えば、デフォルトの検索フィールドに *star* という用語を含むドキュメントを除外するには、`-star` を指定します。`search?q=-star wars` の検索では、*star* という用語は含まれず、*wars* という用語が含まれるすべてのドキュメントが取得されます。
+ **`|`** — 他の用語が含まれていない場合でも、その用語を含むドキュメントが検索結果に含められます。`|` 演算子は、個々の用語にのみ適用されます。例えば、2 つの用語のいずれかが存在するドキュメントを含めるには、`term1 |term2` と指定します。`search?q=star wars |trek` で検索すると、*star* と *wars* の両方、または *trek* という用語を含むドキュメントが取得されます。

これらのプレフィックスは、シンプルなクエリの個々の用語にのみ適用できます。複合クエリを作成するには、簡易クエリパーサーではなく、構造化クエリパーサーを使用する必要があります。例えば、構造化クエリパーサーを使用して *star* および *wars* という用語を検索するには、次のように指定します。

```
(and 'star' 'wars')
```

このクエリでは、検索対象のいずれかのフィールドにそれぞれの用語を含むドキュメントが一致することに注意してください。一致とみなされるには、用語が同じフィールドにある必要はありません。ただし、`(and 'star wars' 'luke')` と指定した場合は、*star* および *wars* は同じフィールド内にある必要があります。*luke* はどのフィールドでもかまいません。

`structured` クエリパーサーを使用するときにフィールドを指定しない場合は、`simple` パーサーの場合と同様に、デフォルトですべての `text` および `text-array` フィールドが検索されます。同様に、`q.options` パラメータを使用して、検索されるフィールドを制御したり、選択したフィールドの重要度を高くすることができます。詳細については、「[複合クエリの作成](searching-compound-queries.md)」を参照してください。

簡易クエリパーサーを使用して、*あいまい*検索を実行することもできます。あいまい検索を実行するには、`~` 演算子と、ユーザーのクエリ文字列と用語が異なっていても一致と見なされる文字数を示す値を追加します。例えば、`planit~1` と指定すると、用語 *planit* を検索しますが、1 文字だけ異なる場合は一致と見なします。つまり、*planet* は結果に含まれます。

## Amazon CloudSearch でのフレーズの検索
<a name="searching-text-phrases"></a>

フレーズを検索すると、Amazon CloudSearch は、指定された順序で完全なフレーズを含むすべてのドキュメントを見つけます。また、*あいまい*フレーズ検索を実行して、相互に指定された距離の範囲内に存在する用語を見つけることもできます。

簡易クエリパーサーを使用した検索で、フレーズ内の個々の用語ではなく、フレーズ全体で一致させるには、フレーズを二重引用符でフレーズを囲みます。例えば、次のクエリでは、*with love* というフレーズを検索します。

```
q="with love"
```

簡易クエリパーサーであいまいフレーズ検索を行うには、`~` 演算子と距離の値を追加します。distance 値には、フレーズ内の単語を分割できる単語の最大数を指定します。例えば、次のクエリは、相互に 3 単語以内で *with love* という用語を検索します。

```
q="with love"~3
```

複合クエリでは、`phrase` 演算子を使用して、次のように一致するフレーズを指定します。

```
(phrase field=title 'star wars')
```

複合クエリであいまいフレーズ検索を実行するには、`near` 演算子を使用します。`near` 演算子を使用して、検索するフレーズと、フィールド内でどのくらい離れた用語まで一致と見なされるかを指定することができます。例えば、次のクエリでは、`title` フィールドで、用語の *star* と *wars* が 3 文字以上離れていないドキュメントを検索します。

```
(near field=title distance=3 'star wars')
```

詳細については、「[複合クエリの作成](searching-compound-queries.md)」を参照してください。

## Amazon CloudSearch でのリテラル文字列の検索
<a name="searching-text-literals"></a>

リテラルフィールドで文字列を検索する場合、Amazon CloudSearch は指定されたフィールドで、大文字/小文字の区別も含め検索文字列全体の完全一致を含むドキュメントのみを返します。例えば、`title` フィールドがリテラルフィールドとして設定されていて、*Star* を検索する場合、一致と見なされるためには、`title` フィールドの値が *Star* でなければなりません。*star*、*star wars*、および *a star is born* は検索結果に含まれません。これは、大文字と小文字が区別されず、指定された検索用語が任意の順序でフィールド内のどこにでも出現できるテキストフィールドの検索とは異なります。

リテラルフィールドを検索するには、検索文字列の前に、検索するリテラルフィールドの名前とコロンを付けます。検索文字列は一重引用符で囲む必要があります。例えば、次のクエリでは、リテラル文字列 *Sci-Fi* を検索します。

```
genres:'Sci-Fi'
```

この例では、各ドキュメントの genre フィールドを検索し、genre フィールドに *Sci-Fi* の値が含まれているすべてのドキュメントに一致します。一致と見なされるには、フィールド値が大文字/小文字の区別も含め、検索文字列と完全に一致する必要があります。例えば、genre フィールドに *Sci-Fi* という値が含まれるドキュメントは、*sci-fi* または *young adult sci-fi* を検索する場合は、検索結果に含まれません。

複合クエリでは、`term` 演算子構文を使用してリテラルフィールドを検索します。例えば、`(term field=genres 'Sci-Fi')` と指定します。詳細については、「[複合クエリの作成](searching-compound-queries.md)」を参照してください。

リテラルフィールドにファセットを組み合わせて使用することで、ファセット属性に基づいて結果をドリルダウンすることができます。ファセットの詳細については、「[Amazon CloudSearch でファセット情報を取得して使用](faceting.md)」を参照してください。

## Amazon CloudSearch でのプレフィックスの検索
<a name="searching-text-prefixes"></a>

`text`、`text-array`、`literal`、および `literal-array` フィールドで、用語全体ではなく*プレフィックス*を検索できます。この一致の結果には、プレフィックスとその後に 0 またはいくつかの文字が含まれます。プレフィックスとして少なくとも 1 文字を指定する必要があります。(すべてのドキュメントを一致させるには、構造化クエリで `matchall` 演算子を使用します。) 一般的に、大量のドキュメントが一致することがないように、2 文字以上のプレフィックスを使用する必要があります。

`text` または `text-array` フィールドを検索するときは、プレフィックスと一致する用語は、フィールドのコンテンツ内のどこにあっても検出できます。リテラルフィールドを検索するときは、プレフィックス文字列を含むそれ以降の検索文字列全体が完全に一致する必要があります。
+ 簡易クエリパーサー — `*` (アスタリスク) ワイルドカード演算子を使用してプレフィックスを検索します (例: `pre*`)。
+ 構造化クエリパーサー — `prefix` 演算子を使用してプレフィックスを検索します (例: `prefix 'pre'`)。

例えば、次のクエリでは、title フィールドで *oce* プレフィックスを検索し、ヒットしたタイトルを返します。

```
q=oce*&q.options={fields:['title']}&return=title
```

この検索をサンプルの映画データに対して実行した場合、*Ocean's Eleven* と *Ocean's Twelve* が返されます。

```
{

    "status": {
        "rid": "hIbIxb8oRAo6swY=",
        "time-ms": 2
    },
    "hits": {
        "found": 2,
        "start": 0,
        "hit": [
            {
                "id": "tt0240772",
                "fields": {
                    "title": "Ocean's Eleven"
                }
            },
            {
                "id": "tt0349903",
                "fields": {
                    "title": "Ocean's Twelve"
                }
            }
        ]
    }

}
```

複合クエリでは、`prefix` 演算子を使用してプレフィックスを検索します。例えば、`title` フィールドで *oce* プレフィックスを検索するには、次のように指定します。

```
q.parser=structured&q=(prefix field%3Dtitle 'oce')
```

URL エンコードに注意してください。詳細については、「[複合クエリの作成](searching-compound-queries.md)」を参照してください。

**注記**  
テキストフィールドでワイルドカード検索を実行するときは、 Amazon CloudSearch がインデックス作成中にテキストフィールドをトークン分割し、そのフィールドに設定された分析スキームに従ってステミングが実行されることに注意してください。Amazon CloudSearch は通常、検索クエリでも同じテキスト処理を実行します。ただし、ワイルドカード演算子 (\$1) または `prefix` 演算子を持つプレフィックスを検索するときは、プレフィックスに対してステミングは実行されません。つまり、`s` で終わるプレフィックスを検索すると、単数形の用語とは一致しないことになります。これは、複数形だけでなく末尾が `s` のあらゆる用語に適用される可能性があります。例えば、サンプル映画データの `actor` フィールドで `Anders` を検索した場合、一致する映画が 3 つあるとします。`Ander*` を検索した場合、それらの映画に加えて他のいくつかの映画が一致します。一方、`Anders*` を検索した場合、一致はありません。これは、用語が `ander` としてインデックスに格納されており、`anders` はインデックスにないためです。Amazon CloudSearch がテキストを処理する方法とそれが検索に与える影響の詳細については、「[Amazon CloudSearch でのテキスト処理](text-processing.md)」を参照してください。

# Amazon CloudSearch での数値の検索
<a name="searching-numbers"></a>

構造化クエリを使用して、特定の値または[値の範囲](searching-ranges.md)を見つけるために検索可能な任意の数値フィールドを検索できます。Amazon CloudSearch は、`double`、`double-array`、`int`、および `int-array` の 4 つの数値フィールドタイプをサポートしています。詳細については、「[インデックスフィールドの設定](configuring-index-fields.md)」を参照してください。

1 つの値を 1 つのフィールドで検索する基本的な構文は、**FIELD**:**VALUE** となります。例えば、`year:2010` は、2010 年にリリースされた映画を見つけるためにサンプルの映画データを検索します。

フィールド構文を使用するには、structured クエリパーサーを使用する必要があります。数値は、引用符で囲まれて*いません*。引用符は値を文字列として指定します。値の範囲を検索するには、上限と下限をカンマ (,) で区切り、ブラケットか中括弧で範囲を囲みます。詳細については、「[値の範囲の検索](searching-ranges.md)」を参照してください。

複合クエリでは、`term` 演算子構文を使用して、1 つの値を検索します。`(term field=year 2010)`

# Amazon CloudSearch での日付と時刻の検索
<a name="searching-dates"></a>

構造化クエリを使用して、検索可能なフィールドで特定の日付と時刻、または[日時範囲](searching-ranges.md)を検索できます。Amazon CloudSearch は、`date` および `date-array`の 2 つの日付フィールドタイプをサポートしています。詳細については、「[インデックスフィールドの設定](configuring-index-fields.md)」を参照してください。

 日付と時刻は、[IETF RFC3339](http://tools.ietf.org/html/rfc3339): `yyyy-mm-ddTHH:mm:ss.SSSZ` に従って、UTC (協定世界時) で指定されます。UTC 形式で、例えば、1970 年 8 月 23 日午後 5 時は、`1970-08-23T17:00:00Z` となります。UTC で時刻を指定する場合は、小数秒を指定することもできます。例えば、`1967-01-31T23:20:50.650Z.`

`date` フィールドで日付 (または時刻) を検索するには、日付文字列を一重引用符で囲む必要があります。例えば、次のクエリはいずれも 2001 年 12 月 25 日の午前 0 時にリリースされたすべての映画に関する映画データを検索します。

```
q.parser=structured&q=release_date:'2001-12-25T00:00:00Z'
q.parser=structured&q=(term field%3Drelease_date '2001-12-25T00:00:00Z')
```

1 日全体を検索する方法については、「[日付範囲の検索](searching-ranges.md#searching-ranges-dates)」を参照してください。

# Amazon CloudSearch での値の範囲の検索
<a name="searching-ranges"></a>

構造化クエリを使用して、1 つのフィールドで値の範囲を検索できます。値の範囲を指定するには、上限と下限をカンマ (,) で区切り、ブラケットか中括弧で範囲を囲みます。角括弧 [ ] は、その境界も範囲に含まれることを示し、波括弧 \$1 \$1 は、境界は除外することを示します。

例えば、サンプルのデータセットから 2008 年から 2010 年まで (これらの年も含む) にリリースされた映画を検索するには、`[2008,2010]` のように範囲を指定します。

期限のない範囲を指定するには、境界を省略します。例えば、`year:[2002,}` は 2002 年以降にリリースされたすべての映画に一致し、`year:{,1970]` は 1970 年までにリリースされたすべての映画に一致します。境界を省略するときは、波括弧を使用する必要があります。

複合クエリでは、`range` 演算子構文を使用して値の範囲を検索します。例: `(range field=year [1967,})`。

## 日付範囲の検索
<a name="searching-ranges-dates"></a>

`date` フィールドで日付 (または時刻) の範囲を検索するには、数値に使用するのと同じ、括弧付きの範囲構文を使用しますが、日付文字列は一重引用符で囲む必要があります。例えば、次のリクエストは、リリース日が 2013 年 1 月 1 日以降のすべての映画を見つけるために映画データを検索します。

```
q.parser=structured&q=release_date:['2013-01-01T00:00:00Z',}
```

固定の範囲を検索するには、次の構文を使用します。

```
q.parser=structured&q=release_date:['2013-01-01T00:00:00Z','2013-01-02T23:59:59Z']
```

## 場所の範囲の検索
<a name="searching-ranges-locations"></a>

場所の範囲を検索することにより、境界ボックス検索を実行できます。`latlon` フィールドで場所の範囲を検索するには、数値に使用するのと同じ、括弧付きの範囲構文を使用しますが、緯度と経度のペアを一重引用符で囲む必要があります。

例えば、各ドキュメントに `location` フィールドを含める場合、`location:['nn.n,nn.n','nn.n,nn.n']` のように境界ボックスフィルタを指定することができます。次の例では、*restaurant* の一致がフィルタされ、カリフォルニア州パソロブレス市​のダウンタウンエリア内の一致のみが結果に含まれます。

```
q='restaurant'&fq=location:['35.628611,-120.694152','35.621966,-120.686706']&q.parser=structured
```

詳細については、「[Amazon CloudSearch での地理的位置による検索および結果のランク付け](searching-locations.md)」を参照してください。

## テキスト範囲の検索
<a name="searching-ranges-text"></a>

括弧付きの範囲構文を使用すると、値の範囲を見つけるためにテキストまたはリテラルフィールドを検索することもできます。日付と同様に、テキスト文字列は一重引用符で囲む必要があります。例えば、次のリクエストは、ドキュメント ID の範囲を見つけるために映画データを検索します。ドキュメント ID を参照するには、特別なフィールド名 `_id` を使用します。

```
_id:['tt1000000','tt1005000']
```

# Amazon CloudSearch での地理的位置による検索および結果のランク付け
<a name="searching-locations"></a>

`latlon` フィールドを使用してドキュメントデータに位置情報を保存する場合、Amazon CloudSearch の式で `haversin` 関数を使用して 2 つの位置の距離を計算できます。ドキュメントデータと共に位置情報を保存することによって、簡単に特定の地域内の検索を実行することもできます。

**Topics**
+ [Amazon CloudSearch での地域内の検索](#within-area)
+ [Amazon CloudSearch での距離による結果のソート](#sorting-by-distance)

## Amazon CloudSearch での地域内の検索
<a name="within-area"></a>

検索ドキュメントに位置情報を関連付けるには、10 進表記を使用して `latlon` フィールドに位置の緯度と経度を保存できます。値はカンマ区切りリスト `lat,lon` で指定され、例えば、`35.628611,-120.694152` のように指定します。ドキュメントと位置情報を関連付けることによって、`fq` パラメータを使って、簡単に検索ヒットを特定の地域に制限することができます。

**境界ボックスを使用して結果を特定の地域に制限するには**

1. 対象とする地域の左上隅と右下隅の緯度と経度を特定します。

1. その境界ボックスの座標を使用して、一致するドキュメントをフィルタするには、`fq` パラメータを使用します。例えば、各ドキュメントに `location` フィールドを含める場合、`fq=location:['nn.n,nn.n','nn.n,nn.n'] ` のように境界ボックスフィルタを指定することができます。次の例では、*restaurant* の一致がフィルタされ、カリフォルニア州パソロブレス市​のダウンタウンエリア内の一致のみが結果に含まれます。

   ```
   q='restaurant'&fq=location:['35.628611,-120.694152','35.621966,-120.686706']&q.parser=structured
   ```

## Amazon CloudSearch での距離による結果のソート
<a name="sorting-by-distance"></a>

検索リクエストの一部として式を定義して、距離で結果をソートできます。Amazon CloudSearch の式は、`haversin` 関数をサポートします。この関数は、各点の緯度と経度を使用して、球上の 2 つのポイント間の大円距離を計算します。(詳細については、[半正矢関数の公式](http://en.wikipedia.org/wiki/Haversine_formula)を参照してください)。結果の距離は km 単位で返されます。

一致する各ドキュメントとユーザーとの距離を計算するには、ユーザーの位置情報を `haversin` 関数に渡し、`latlon` フィールドに保存されたドキュメントの位置情報を参照します。10 進表記でユーザーの緯度と経度を指定し、`latlon` に保存された緯度と経度に、`FIELD.latitude` と `FIELD.longitude` を使ってアクセスします。例えば、`expr.distance=haversin(userlat,userlon, location.latitude,location.longitude)`。

式を使用して検索結果をソートするには、`sort` パラメータを指定します。

例えば、次のクエリは、レストランを検索し、ユーザーからの距離によって結果をソートします。

```
q=restaurant&expr.distance=haversin(35.621966,-120.686706,location.latitude,location.longitude)&sort=distance asc
```

明示的にソート方向 (`asc` または `desc`) を指定する必要があることに注意してください。

`return` パラメータで式の名前を指定することよって、各ドキュメントについて計算された距離を検索結果に含めることができます。例えば、`return=distance`。

ドキュメントの関連性 `_score` など、他の特性を考慮するより複雑な式で距離の値を使用することもできます。以下の例で、2 番目の rank 式では、ドキュメントの計算された `distance` とその関連性 `_score` の両方を使用します。

```
expr.distance=haversin(38.958687,-77.343149,latitude,longitude)&expr.myrank=_score/log10(distance)&sort=myrank+desc
```

**ヒント**  
これらのサンプルクエリを機能させるには、`latlon`フィールドで[インデックスを設定](configuring-index-fields.md)し、ドキュメント内に `location` データがなければなりません。  

```
{
  "fields": {
    "location": "40.05830,-74.40570"
  }
}
```
このフィールドが存在しない場合、検索を実行すると次のエラーメッセージが表示される可能性があります。  

```
Syntax error in query: field (location) does not exist.
```

式を使用した検索結果のソートの詳細については、「[検索結果の制御](controlling-search-results.md)」を参照してください。

# Amazon CloudSearch による DynamoDB データの検索
<a name="searching-dynamodb-data"></a>

インデックスオプションを設定するとき、またはコンソールを介してデータを検索ドメインにアップロードするときに、DynamoDB テーブルをソースとして指定できます。これにより、検索ドメインをすばやくセットアップし、DynamoDB データベーステーブルに保存されているデータの検索を試みることができます。

検索ドメインがテーブルの変更と同期された状態を保つには、テーブルおよび検索ドメインの両方に更新を送信するか、テーブル全体を新しい検索ドメインに定期的に読み込むことができます。

**Topics**
+ [DynamoDB データを検索するための Amazon CloudSearch ドメインの構成](#searching-dynamodb-data.configuring)
+ [DynamoDB から Amazon CloudSearch へのデータのアップロード](#searching-dynamodb-data.uploading)
+ [検索ドメインと DynamoDB テーブルの同期](#searching-dynamodb-data.sync)

## DynamoDB データを検索するための Amazon CloudSearch ドメインの構成
<a name="searching-dynamodb-data.configuring"></a>

DynamoDB データを検索するように検索ドメインを設定するには、Amazon CloudSearch コンソールを使用するのが最も簡単です。コンソールの設定ウィザードは、テーブルデータを分析し、テーブル内の属性に基づいて推奨されるインデックス作成オプションを表示します。推奨される設定を変更して、インデックスを作成するテーブル属性を制御できます。

**注記**  
DynamoDB からデータをアップロードするには、サービスとアップロードするリソースの両方に対するアクセス許可が必要です。詳細については、「[IAM を使用して DynamoDB リソースへのアクセスをコントロールする](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html)」を参照してください。

DynamoDB テーブルから検索ドメインを自動的に設定すると、最大 200 の一意の属性をインデックスフィールドにマッピングできます (200 を超えるフィールドを検索ドメインに設定することはできないため、属性が 200 未満の DynamoDB テーブルからのみデータをアップロードできます)。Amazon CloudSearch により、一意の値の数が少ない属性が検出されると、フィールドの推奨される設定でファセットが有効になります。

**重要**  
DynamoDB テーブルを使用してドメインを設定しても、データがインデックス作成のためにドメインに自動的にアップロードされることはありません。ドメインを設定した後、別個のステップとしてインデックス作成のためにデータをアップロードする必要があります。

### Amazon CloudSearch コンソールを使用した DynamoDB を検索するためのドメインの設定
<a name="w2aac17c27b9c11"></a>

DynamoDB テーブルのデータを分析して検索ドメインを設定するために、Amazon CloudSearch コンソールを使用できます。テーブルのサイズに関係なく、最大 5 MB が読み取られます。デフォルトでは、Amazon CloudSearch はテーブルの先頭から読み取ります。開始キーを指定して、特定の項目から読み取りを開始できます。

**DynamoDB テーブルを使用して検索ドメインを設定するには**

1. Amazon CloudSearch コンソール ([https://console.aws.amazon.com/cloudsearch/home](https://console.aws.amazon.com/cloudsearch/home)) を開きます。

1. 左側のナビゲーションペインから **[ドメイン]** を選択します。

1. ドメイン名を選択し、詳細パネルを開きます。

1. **[インデックスオプション]** タブに移動し、**[設定ウィザード]** を選択します。

1. **[Amazon DynamoDB]** を選択します。

1. 分析する DynamoDB テーブルを選択します。
   + テーブルからの読み取り時に消費可能な読み取りキャパシティーユニットを制限するには、使用する読み取りキャパシティーユニットの最大パーセンテージを入力します。
   + 特定の項目から読み取りを開始するには、**[ハッシュキーを開始]** を指定します。テーブルでハッシュおよび範囲タイプのプライマリキーが指定されている場合、項目のハッシュ属性と範囲属性の両方を指定します。

1. [**次へ**] を選択します。

1. 推奨される設定を確認します。これらのフィールドを編集して、フィールドを追加できます。

1. 完了したら、**[確認]** を選択します。

1. まだデータをドメインにアップロードしていない場合は、**[今すぐインデックスを作成する]** チェックボックスをオフにして、インデックスを作成せずに終了します。設定の変更が終了し、新しい設定でデータのインデックスを作成する準備ができたら、**[今すぐインデックスを作成する]** が選択されていることを確認します。変更を適用する準備が完了したら、**[完了]** を選択します。

## DynamoDB から Amazon CloudSearch へのデータのアップロード
<a name="searching-dynamodb-data.uploading"></a>

Amazon CloudSearch コンソールまたは Amazon CloudSearch コマンドラインツールを使用して、検索ドメインに DynamoDB データをアップロードできます。DynamoDB テーブルからデータをアップロードすると、インデックスを作成できるように Amazon CloudSearch によってドキュメントバッチに変換されます。ドメイン設定で各属性のインデックスフィールドを選択して定義します。詳細については、「[DynamoDB データを検索するための Amazon CloudSearch ドメインの構成](#searching-dynamodb-data.configuring)」を参照してください。

複数の DynamoDB テーブルから同じ Amazon CloudSearch ドメインにデータをアップロードできます。ただし、すべてのテーブルから最大 200 の属性を組み合わせてアップロードできることに注意してください。同じキーを持つ項目が、アップロードされた複数のテーブルに存在する場合、最後に適用された項目により、それより前のすべてのバージョンが上書きされます。

テーブルデータをドキュメントバッチに変換すると、Amazon CloudSearch によりテーブルから読み取られる項目ごとにドキュメントが生成され、各項目の属性がドキュメントフィールドとして表されます。各ドキュメントの一意の ID は、`docid` 項目属性 (存在する場合) から読み取られるか、プライマリキーに基づいて英数字値が割り当てられます。

Amazon CloudSearch により、テーブル項目のドキュメントが生成された場合:
+ 文字列セットと数値セットは、多値フィールドとして表されます。DynamoDB セットに 100 個を超える値が含まれている場合、最初の 100 個の値だけが多値フィールドに追加されます。
+ DynamoDB バイナリ属性は無視されます。
+ 属性名は、フィールド名の Amazon CloudSearch 命名規則に準拠するように変更されます。
  + 大文字はすべて小文字に変換されます。
  + DynamoDB 属性名の先頭が文字でない場合、フィールド名の先頭には `f_` が付きます。
  + a～z、0～9、\$1 (下線) 以外のすべての文字は、下線で置き換えられます。この変換の結果フィールド名が重複する場合、フィールド名を一意にするために番号が付けられます。例えば、属性名 `håt`、`h-t`、`hát` はそれぞれ `h_t`、`h_t1`、`h_t2` にマッピングされます。
  + DynamoDB 属性名が 64 文字を超える場合、属性名の最初の 56 文字が属性名全体の 8 文字の MD5 ハッシュで連結され、フィールド名が形成されます。
  + 属性名が `body` の場合、フィールド名 `f_body` にマッピングされます。
  + 属性名が ` _score` の場合、フィールド名 ` f_ _score` にマッピングされます。
+ 数値属性は Amazon CloudSearch int フィールドにマッピングされ、値は 32 ビットの符号なし整数に変換されます。
  + 数値属性に 10 進値が含まれる場合、値の整数部だけが保存されます。小数点の右側の値はすべて削除されます。
  + 符号なし整数として保存可能な値より値が大きい場合、値は切り捨てられます。
  + 負の整数は、正の符号なし整数として扱われます。

### Amazon CloudSearch コンソールを使用したドメインへの DynamoDB データのアップロード
<a name="searching-dynamodb-data-console"></a>

Amazon CloudSearch コンソールを使用して、5 MB までのデータを DynamoDB テーブルから検索ドメインにアップロードできます。

**コンソールを使用して DynamoDB データをアップロードするには**

1. Amazon CloudSearch コンソール ([https://console.aws.amazon.com/cloudsearch/home](https://console.aws.amazon.com/cloudsearch/home)) を開きます。

1. 左側のナビゲーションペインから **[ドメイン]** を選択します。

1. ドメイン名を選択し、設定を開きます。

1. **[アクション]**、**[ドキュメントをアップロード]** の順に選択します。

1. **[Amazon DynamoDB]** を選択します。

1. ドロップダウンから、データを含む DynamoDB テーブルを選択します。
   + テーブルからの読み取り時に消費可能な読み取りキャパシティユニットを制限するには、読み取りキャパシティユニットの最大パーセンテージを入力します。
   + 特定の項目から読み取りを開始するには、**[ハッシュキーを開始]** を指定します。テーブルでハッシュおよび範囲タイプのプライマリキーが指定されている場合、項目のハッシュ属性と範囲属性の両方を指定します。

1. テーブルオプションの指定が完了したら、**[次へ]** を選択します。

1. アップロードされる項目を確認します。**[生成されたドキュメントバッチをダウンロード]** を選択して、生成されたドキュメントバッチを保存することもできます。次に、**[ドキュメントをアップロード]** を選択します。

## 検索ドメインと DynamoDB テーブルの同期
<a name="searching-dynamodb-data.sync"></a>

検索ドメインと DynamoDB テーブルの更新が同期された状態を保つには、更新をプログラムにより追跡してドメインに適用するか、新しいドメインを定期的に作成してテーブル全体を再度アップロードできます。大量のデータがある場合、プログラムにより更新を追跡して適用することをお勧めします。

### プログラムによる更新の同期
<a name="searching-dynamodb-data.sync.programmatically"></a>

DynamoDB テーブルへの変更と追加を同期させるには、別個の更新テーブルを作成して検索対象のテーブルの変更を追跡し、更新テーブルの内容を対応する検索ドメインに定期的にアップロードできます。

検索ドメインからドキュメントを削除するには、削除された各ドキュメントの削除オペレーションを含むドキュメントバッチを生成してアップロードする必要があります。1 つの方法として、別個の DynamoDB テーブルを使用して削除された項目を追跡し、テーブルを定期的に処理して削除オペレーションのバッチを生成し、バッチを検索ドメインにアップロードすることができます。

初期データアップロード時に加えた変更が失われないようにするために、追跡の変更の収集は初期データアップロードの前に開始する必要があります。一部の Amazon CloudSearch ドキュメントは同じデータで更新できますが、変更が失われておらず、検索ドメインに各ドキュメントの最新バージョンが含まれていることを確認してください。

更新を同期させる頻度は、変更のボリュームと更新のレーテンシーの許容度によって決まります。1 つの方法として、一定期間の変更を蓄積し、その期間の終わりに変更をアップロードして、その期間の追跡テーブルを削除することができます。

例えば、変更と追加項目を 1 日 1 回同期させるには、1 日の始めに updates\$1YYYY\$1MM\$1DD というテーブルを作成して毎日の更新を収集できます。1 日の終わりに、updates\$1YYYY\$1MM\$1DD テーブルを検索ドメインにアップロードします アップロードが完了したら、更新テーブルを削除し、翌日の新しいテーブルを作成できます。

### 新しい検索ドメインへの切り替え
<a name="searching-dynamodb-data.sync.newtable"></a>

個々の更新を追跡してテーブルに適用しない場合、テーブル全体を新しい検索ドメインに定期的に読み込み、クエリトラフィックを新しいドメインに切り替えることができます。

**新しい検索ドメインに切り替えるには**

1. 新しい検索ドメインを作成し、既存のドメインから設定をコピーします。

1. DynamoDB テーブル全体を新しいドメインにアップロードします 詳細については、「[DynamoDB から Amazon CloudSearch へのデータのアップロード](#searching-dynamodb-data.uploading)」を参照してください。

1. 新しいドメインがアクティブになったら、新しいドメインをポイントするようクエリトラフィックを古い検索ドメインに転送する DNS エントリを更新します。例えば、[Amazon Route 53](https://aws.amazon.com/route53/) を使用している場合、新しい検索サービスエンドポイントでレコードセットを更新するだけで済みます。

1. 古いドメインを削除します。

# Amazon CloudSearch での一致するドキュメントのフィルタリング
<a name="filtering-results"></a>

`fq` パラメータを使用すると、`q` パラメータで指定された検索条件と一致するドキュメントを、検索結果に含まれるドキュメントの関連性スコアに影響を与えることなくフィルタできます。フィルタを指定して、一致したドキュメントのうちどれを結果に含めるかを制御できますが、ドキュメントのスコアやソート順には影響しません。

`fq` パラメータは、「[検索 API リファレンス](search-api.md)」で説明されている構造化クエリ構文をサポートしています。

例えば、項目の在庫があるかどうかを示す `available` フィールドをドキュメントに追加し、そのフィールドをフィルタして、結果を在庫のある項目のみに制限します。

```
search?q=star+wars&fq=available:'true'&return=title
```

# Amazon CloudSearch での検索リクエストのパフォーマンスのチューニング
<a name="tuning-search"></a>

検索リクエストの処理には、大量のリソースが消費される可能性があり、検索ドメインのパフォーマンスと実行コストに影響を与えることがあります。一般に、大量のヒット項目を返す検索や複雑な構造化クエリは、検索ドメインのドキュメントが一致する割合が低い単純なテキストクエリよりも多くのリソースを消費します。

応答時間が長く、内部サーバーエラー (507 または 509 エラーが一般的) が頻繁に発生する場合や、検索対象のデータのボリュームの実質的な増加はないにもかかわらず、検索ドメインが消費するインスタンス時間数が増加している場合は、検索リクエストを微調整することで処理のオーバーヘッドを削減できます。このセクションでは、検索リクエストをチューニングするための注意事項とステップについて説明します。

## クエリのレイテンシー分析
<a name="tuning-search-latency"></a>

リクエストをチューニングする前に、現在の検索パフォーマンスを分析する必要があります。検索リクエストと応答時間のログを作成し、処理に最も時間のかかるリクエストを特定します。時間のかかる検索は、検索ドメインのリソースを拘束することで、全体的なパフォーマンスに不釣り合いな影響を与える可能性があります。最も時間のかかる検索リクエストを最適化することで、*すべての*検索の速度が上がります。

**Topics**
+ [ヒット数の削減](#tuning-search-numdocs)
+ [構造化クエリの単純化](#simplifying-structured-queries)

### ヒット数の削減
<a name="tuning-search-numdocs"></a>

クエリのレイテンシーは、一致するドキュメントの数に正比例します。ほとんどのドキュメントに一致する検索が、一般的には最も遅くなります。

一般的に多数のドキュメントに一致する結果となる 2 種類の検索を削除することで、全体的なパフォーマンスを劇的に改善できます。
+ コーパス内のすべてのドキュメントに一致するクエリ (`matchall`)。これは、ドメイン内のすべてのドキュメントのリストを作成するには便利な方法ですが、リソースを多用するクエリです。ドキュメントのボリュームが多い場合は、他のリクエストがタイムアウトする原因になるだけでなく、それ自体もタイムアウトする可能性があります。
+ 1\$12 文字のみを指定したプレフィックス (ワイルドカード) 検索。このタイプの検索を使用して、ユーザーの入力として即時に結果を提供する場合、ユーザーが少なくとも 2 文字入力するのを待ってから、クエリを送信し、可能性のある候補を表示します。

リクエストに一致するドキュメントの数を減らすには、次の操作を行うこともできます。
+ 関係のない単語は、マッチングに使用されないようにコーパスから削除します。最も簡単な方法は、使用している分析スキーマのストップワードリストディクショナリに追加することです。また、データの前処理を行って、無関係の単語を削除することができます。関係のない単語を削除するとインデックスのサイズが縮小されるというメリットもあり、それがコスト削減に繋がる可能性もあります。
+ `fq` パラメータを使用して、特定のフィールドの値に基づいて結果を明示的にフィルタします。

それでも多数のドキュメントに一致するリクエストがある場合、結果セットに対して行う処理のボリュームを最小化することで、レイテンシーを減らすことができます。
+ リクエストするファセット情報を最小限に抑えます。ファセットカウントの生成により処理に必要な時間が長くなり、他のリクエストがタイムアウトする可能性が高くなります。ファセット情報をリクエストする場合、指定するファセットが多いほど、リクエストの処理時間が長くなります。
+ ソートに独自の式を使用しないようにします。結果のソートに必要な処理が追加されると、リクエストがタイムアウトする可能性が高くなります。結果のソート方法をカスタマイズする必要がある場合は、一般的に式を使用するよりもフィールドを使用する方が時間はかかりません。

検索結果で大量のデータを返すと、転送時間が長くなり、クエリのレイテンシーにも影響します。返すフィールド数を最小にすることで、パフォーマンスを改善し、インデックスのサイズを縮小することができます。

### 構造化クエリの単純化
<a name="simplifying-structured-queries"></a>

クエリ条件の句の数が多いほど、クエリの処理時間が長くなります。

適切に機能しない複雑な構造化クエリがある場合は、句の数を減らす方法を見つける必要があります。場合によっては、制限を設定したり、クエリを再生成できる可能性があります。その他に、より単純なクエリに対応するためにドメイン設定を変更しなければならない場合があります。