

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon CloudSearch 中建構複合查詢
<a name="searching-compound-queries"></a>

您可以使用結構式查詢剖析器透過布林值 `and`、`or` 和 `not` 運算子結合各個比對運算式。若要選擇結構式查詢剖析器，您的查詢中應指定 `q.parser=structured`。結構式查詢運算子是指定成*「字首」*運算子。語法是：
+ `(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'`)。如果特殊字元不是 URL 編碼，Amazon CloudSearch 會傳回`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})))
```

若要提交此搜尋請求，您必須對查詢字串進行編碼，並且使用 `q.parser` 參數指定 `structured` 查詢剖析器。

```
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* 一詞，並且排除 * 欄位內包含 *Zachary Quinto`actors` 的文件。

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

您可透過指定 `boost` 值以提高複合查詢的某個運算式相對於其他運算式的重要性。此提升值將提高相符文件的分數。例如，以下查詢會就 * 欄位而非 * 欄位內出現 `title`star`description` 一詞的相符項目提高其分數。

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

提升值必須大於零。

除了 `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)。