

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

# 使用 Amazon CloudSearch 搜尋您的資料
<a name="searching"></a>

您要使用 `q` 參數指定欲搜尋的字詞或值。您指定搜尋條件的方式取決於您使用的查詢剖析器。Amazon CloudSearch 支援四個查詢剖析器：
+ `simple`- 搜尋指定字串的所有 `text`和 `text-array` 欄位。使用 simple 查詢剖析器可搜尋片語、個別字詞及字首。您可以指定各字詞為必要項目或選用項目，或是排除含有特定字詞的相符項目。若要搜尋特定欄位，您可以使用 `q.options` 參數指定欲搜尋的欄位。如果未指定 `q.parser` 參數，預設即會使用 `simple` 查詢剖析器。
+ `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 主控台中的搜尋測試器來搜尋您的資料、瀏覽結果，以及檢視產生的請求 URLs和 JSON 和 XML 回應。如需詳細資訊，請參閱[使用搜尋測試器進行搜尋](getting-started-search.md#searching-console)。

**重要**  
搜尋端點不會變更：網域的文件和搜尋端點在網域的生命週期內保持不變。應當對端點進行快取處理，而非在每次上傳或搜尋請求之前擷取端點。在每次請求可能導致您的請求受到調節`DescribeDomains`之前，透過呼叫 `aws cloudsearch describe-domains`或 查詢 Amazon CloudSearch 組態服務。
IP 地址**確實**會變更：您網域的 IP 地址*可能會*隨著時間而變更，因此快取端點很重要，如主控台所示，並由 `aws cloudsearch describe-domains`命令傳回，而不是 IP 地址。您也應該定期將端點 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 SDKs會以陣列的形式傳回欄位。單一值欄位會傳回為具有一個元素的陣列，例如：  

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

為了開發和測試目的，您可以允許匿名存取網域的搜尋服務，並將未簽署的 HTTP GET 或 POST 請求直接提交至網域的搜尋端點。在生產環境中，將對您網域的存取限制為特定 IAM 角色、群組或使用者，並使用 AWS SDKs或 提交簽署的請求 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 請求直接傳送到網域搜尋端點的方法：您可以直接在 Web 瀏覽器中輸入請求 URL、使用 cURL 提交請求，或使用您最愛的 HTTP 程式庫產生 HTTP 呼叫。若要指定搜尋條件，您可以指定查詢字串，指定搜尋的限制條件，以及您要在回應中傳回的內容。查詢字串必須以 URL 編碼。透過 GET 提交的搜尋請求大小上限為 8190 個位元組，包括 HTTP 方法、URI 和通訊協定版本。您可以使用 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 主控台中的搜尋測試器可讓您使用任何支援的查詢剖析器來提交範例搜尋請求：簡單、結構化、純素或解調。根據預設，請求會使用簡單的查詢剖析器來處理。您可以指定所選剖析器的選項、篩選和排序結果，以及瀏覽設定的面向。搜尋結果中會自動反白顯示搜尋命中。如需如何完成此操作的詳細資訊，請參閱[反白顯示 Amazon CloudSearch 中的搜尋點](highlighting.md)。您也可以在**搜尋**欄位中輸入詞彙時，選取建議者以取得建議。（您必須先設定建議者，才能取得建議。 如需詳細資訊，請參閱 [在 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`欄位中指定命中`title^5, description`權重比`description`欄位中命中權重高五倍。

若要使用結構化查詢語法，請從**查詢剖析器**功能表中選取**結構化**。選取結構化查詢剖析器後，請在**搜尋**欄位中輸入您的結構化查詢，然後選擇**執行**。例如，若要在 2000 年或更早發行的標題中尋找具有*星號*的所有電影，您可以輸入：`(and title:'star' year:{,2000])`。如需詳細資訊，請參閱[建構複合查詢](searching-compound-queries.md)。若要提交 Lucene 或 DisMax 查詢，請選取適當的查詢剖析器。

您可以為選取的查詢剖析器指定其他選項，以設定預設運算子，並控制可在查詢中使用的運算子。如需詳細資訊，請參閱[搜尋請求參數](search-api.md#search-request-parameters)。

您可以複製並貼上請求 URL 以提交請求，並從 Web 瀏覽器檢視回應。請求可以透過 HTTP 或 HTTPS 傳送。

# 在 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)。

# 在 Amazon CloudSearch 中搜尋文字
<a name="searching-text"></a>

您可透過搜尋文字欄位和常值欄位以找出任一文字字串：
+ `Text` 和 `text-array` 欄位一律可供搜尋。您可以搜尋個別字詞和片語。於 `text` 和 `text-array` 欄位內搜尋時不區分大小寫。
+ `Literal` 和 `literal-array` 欄位僅限於已由網域的索引選項啟用搜尋時才可供搜尋。您可以搜尋與指定的搜尋字串完全相符的項目。於常值欄位內搜尋時區分大小寫。

若您使用 simple 查詢剖析器或者使用結構式查詢剖析器搜尋而未指定任何欄位，預設即會搜尋所有 `text` 和 `text-array` 欄位。預設情況下將*不會*搜尋常值欄位。您可以使用 `q.options` 參數指定要搜尋哪些欄位。

您可以搜尋具有唯一性的文件 ID 欄位，就如同搜尋任何文字欄位。若要由搜尋請求中參考文件 ID 欄位，請使用欄位名稱 `_id`。文件 ID 一律會隨搜尋結果傳回。

**Topics**
+ [在 Amazon CloudSearch 中搜尋個別術語](#searching-text-terms)
+ [在 Amazon CloudSearch 中搜尋 Phrases](#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`該欄位尋找*星星*，您會在`title`欄位的任何位置找到包含*星星*的所有電影，例如*星星*、*星際大戰*和*星星。*這和搜尋 `literal` 欄位不同，後者的情況是欄位值必須與搜尋字串一字不差才會視為相符。

`simple` 查詢剖析器提供簡便的方式可搜尋 `text` 和 `text-array` 欄位以找出一個或多個字詞。預設即是使用 `simple` 查詢剖析器，除非您透過 `q.parser` 參數指定另一種查詢剖析器。

例如，若要搜尋 *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`。指定多個搜尋詞彙時，預設情況是文件必須包含所有的字詞才會視為相符。各字詞可出現於文字欄位內的任一處，順序不拘。

預設情況下，使用 simple 查詢剖析器時將搜尋所有 `text` 和 `text-array` 欄位。您可以使用 `q.options` 參數指定要搜尋哪些欄位。例如，以下查詢將搜尋限制在 `title` 和 `description` 欄位，並且提升 `title` 欄位內相符項目的重要性高過 `description` 欄位內的相符項目。

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

使用 simple 查詢剖析器時，您可以使用下列字首指定個別字詞為必要項目或選用項目，或是將其排除在搜尋結果之外：
+ **`+`**- 相符的文件必須包含 術語。此為預設情況；以空格分隔各字詞即等同於各字詞以 `+` 做為字首。
+ **`-`**- 從搜尋結果中排除包含術語的文件。`-` 運算子只會套用至個別字詞。例如，若要將預設搜尋的欄位內包含 *star* 一詞的文件排除，請指定：`-star`。搜尋 `search?q=-star wars` 則會擷取所有不含 *star* 一詞但包含 *wars* 一詞的文件。
+ **`|`**- 在搜尋結果中包含包含字詞的文件，即使不包含其他字詞也一樣。`|` 運算子只會套用至個別字詞。例如，若要納入包含兩個字詞之其一的文件，請指定：`term1 |term2`。搜尋 `search?q=star wars |trek` 則會納入同時包含 *star* 和 *wars* 兩個字詞或者是 *trek* 一詞的文件。

上述字首僅適用於簡易查詢中的個別字詞。若要建構複合查詢，您必須使用結構式查詢剖析器而非 simple 查詢剖析器。例如，使用結構式查詢剖析器搜尋 *star* 和 *wars* 兩個字詞時，指定方式為：

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

請注意，此查詢會比對任何搜尋的欄位內包含各字詞的文件。各字詞即使不在同一個欄位內亦將視為相符。不過，若您指定 `(and 'star wars' 'luke')`，*star* 和 *wars* 就必須出現於同一個欄位內，而 *luke* 所在的欄位則不拘。

使用 `structured` 查詢剖析器時若您未指定任何欄位，預設即會搜尋所有 `text` 和 `text-array` 欄位，就如同使用 `simple` 剖析器。同樣地，您可以使用 `q.options` 參數指定欲搜尋的欄位及提高選定欄位的重要性。如需詳細資訊，請參閱[建構複合查詢](searching-compound-queries.md)。

使用 simple 查詢剖析器也能進行*「模糊」*搜尋。若要進行模糊搜尋，請附加 `~` 運算子和一個值，以表示容許各字詞與使用者查詢字串差別到什麼程度下仍會視為相符。例如，指定 `planit~1` 會搜尋 *planit* 一詞並容許比對相差到一個字元，亦即結果將包括 *planet* 的命中項目。

## 在 Amazon CloudSearch 中搜尋 Phrases
<a name="searching-text-phrases"></a>

當您搜尋片語時，Amazon CloudSearch 會依指定的順序尋找包含完整片語的所有文件。您也可以進行*「鬆散」*片語搜尋，找出各字詞彼此相隔在指定距離內的片語。

若要使用 simple 查詢剖析器搜尋比對完整片語而非片語中的個別字詞，請用雙引號括住整段片語。例如，以下查詢將搜尋 *with love* 這個片語。

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

若要使用 simple 查詢剖析器進行鬆散片語搜尋，請附加 `~` 運算子和一個距離值。此距離值指定片語中的各個單詞可相隔的字數上限。例如，以下查詢將搜尋 *with love* 兩個字詞彼此相隔在三個字內的詞句。

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

複合查詢則是使用 `phrase` 運算子指定欲比對的片語，例如：

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

若要由複合查詢進行鬆散片語搜尋，請使用 `near` 運算子。`near` 運算子可讓您指定想要尋找的片語，以及欄位內的各字詞在相隔多遠的情況下仍會視為相符。例如，以下查詢將比對 * 欄位內 *star* 和 *wars`title` 兩個字詞彼此相隔不超過三個字的文件。

```
(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* 和 *star born* 將不會包含在搜尋結果中。這和文字欄位不同，後者的情況是搜尋不區分大小寫，而且指定的搜尋詞彙可出現於欄位內的任一處，順序不拘。

若要搜尋常值欄位，請於搜尋字串前加上您要搜尋的常值欄位的名稱做為字首，後接冒號。搜尋字串必須用單引號括住。例如，以下查詢將搜尋常值字串 *Sci-Fi*。

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

此範例會搜尋每份文件的 genre 欄位，並且比對 genre 欄位內包含 *Sci-Fi* 值的所有文件。若要比對為相符，欄位值必須完全符合整個搜尋字串，包括大小寫。例如，若您搜尋 *sci-fi* 或 *young adult sci-fi*，凡 genre 欄位內包含 *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` 欄位以找出任何*「字首」*而非整個字詞。其比對結果將包含該字首，後接零個或多個字元。您必須指定至少一個字元做為字首 (若要比對所有文件，請由結構式查詢中使用 `matchall` 運算子)。一般而言，您應使用至少包含兩個字元的字首，以免比對的文件過多。

當您搜尋 `text` 或 `text-array` 欄位時，與字首相符的字詞可出現於欄位內容的任一處。若是搜尋常值欄位，則整個搜尋字串乃至包括字首字元皆需完全相符。
+ Simple 查詢剖析器 - 使用 `*` (星號) 萬用字元運算子可搜尋字首，例如 `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`，就會有三部符合條件的電影。若您搜尋 `Ander*`，則除了同樣三部以外還會多出其他幾部電影。然而，搜尋 `Anders*` 將找不到任何相符項目。這是因為存放於索引中的字詞為 `ander`，而 `anders` 並未出現在索引中。如需 Amazon CloudSearch 如何處理文字及其如何影響搜尋的詳細資訊，請參閱 [Amazon CloudSearch 中的文字處理](text-processing.md)。

# 在 Amazon CloudSearch 中搜尋數字
<a name="searching-numbers"></a>

您可以使用結構化查詢來搜尋任何已啟用搜尋的數值欄位，以取得特定值或[值範圍](searching-ranges.md)。Amazon CloudSearch 支援四種數值欄位類型：`double`、`int`、 `double-array`和 `int-array`。如需詳細資訊，請參閱[設定索引欄位](configuring-index-fields.md)。

搜尋欄位以找出單一值的基本語法是 **FIELD**​:**VALUE**。例如，對電影範例資料搜尋 `year:2010` 可找到 2010 年所發行的電影。

您必須使用結構式查詢剖析器才能使用此欄位語法。請注意，數值*不會*以引號括住，引號會將值指定為字串。若要搜尋某個範圍的值，請使用逗號 (,) 分隔上限和下限，然後用方括號或大括號將範圍括住。如需詳細資訊，請參閱[搜尋某個範圍的值](searching-ranges.md)。

複合查詢則是使用 `term` 運算子語法搜尋單一值：`(term field=year 2010)`。

# 在 Amazon CloudSearch 中搜尋日期和時間
<a name="searching-dates"></a>

您可以使用結構化查詢來搜尋特定日期和時間或[日期時間範圍](searching-ranges.md)的任何已啟用搜尋的日期欄位。Amazon CloudSearch 支援兩種日期欄位類型 `date`和 `date-array`。如需詳細資訊，請參閱[設定索引欄位](configuring-index-fields.md)。

 根據 [IETF RFC3339](http://tools.ietf.org/html/rfc3339)，日期和時間是以 UTC （國際標準時間） 指定：`yyyy-mm-ddTHH:mm:ss.SSSZ`。例如，在 UTC 中，1970 年 8 月 23 日下午 5：00 是：`1970-08-23T17:00:00Z`。請注意，在 UTC 中指定時間時，您也可以指定分數秒。例如 `1967-01-31T23:20:50.650Z.` 

若要於 `date` 欄位內搜尋日期 (或時間)，日期字串必須用單引號括住。例如，以下兩組查詢將對電影資料搜尋 2001 年 12 月 25 日午夜發行的所有電影：

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

若要搜尋全天的資訊，請參閱[搜尋日期範圍](searching-ranges.md#searching-ranges-dates)。

# 在 Amazon CloudSearch 中搜尋一系列的值
<a name="searching-ranges"></a>

您可使用結構式查詢搜尋欄位以找出某個範圍的值。若要指定值的範圍，請使用逗號 (,) 來區隔上下限，並以括號將範圍括住。方括號 [ 或 ] 表示界限要含括在範圍內，大括號 \$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* 已經過篩選，所以結果只會包含位於美國加州 Paso Robles 市區內的相符項目。

```
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`函數來計算兩個位置之間的距離。用文件資料存放位置亦方便您在特定區域內進行搜尋。

**Topics**
+ [在 Amazon CloudSearch 中的區域內搜尋](#within-area)
+ [在 Amazon CloudSearch 中依距離排序結果](#sorting-by-distance)

## 在 Amazon CloudSearch 中的區域內搜尋
<a name="within-area"></a>

若要將位置與搜尋文件產生關聯，您可以使用十進位度數表示法將位置的經緯度存放於 `latlon` 欄位。這些值指定為逗號分隔清單，`lat,lon`例如 `35.628611,-120.694152`。位置與文件產生關聯讓您能夠利用 `fq` 參數輕鬆地將搜尋命中項目限制於特定區域。

**使用週框方塊將結果限制於特定區域**

1. 判定您感興趣的區域其左上角和右下角的經緯度。

1. 使用 `fq` 參數指定各個週框方塊座標以篩選相符的文件。例如，若您的每份文件皆包含 `location` 欄位，您可以將週框方塊篩選條件指定為 `fq=location:['nn.n,nn.n','nn.n,nn.n'] `。在以下範例中，進行比對的 *restaurant* 已經過篩選，所以結果只會包含位於美國加州 Paso Robles 市區內的相符項目。

   ```
   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`函數使用每個點的經緯度計算球體上兩個點之間的大圓距離。(如需詳細資訊，請參閱[半正矢公式](http://en.wikipedia.org/wiki/Haversine_formula))。算出的距離是以公里數傳回。

為了計算每份相符文件與使用者之間的距離，您要將使用者的位置傳入 `haversin` 函數並參考存放於 `latlon` 欄位的文件位置。請以十進位度數表示法指定使用者的經緯度，並透過 `FIELD.latitude` 和 `FIELD.longitude` 語法存取存放於 `latlon` 的緯度和經度。例如 `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`) 納入考量。在以下範例中，另一個排名運算式同時使用了對文件算出的 `distance` 及其相關性 `_score`。

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

**提示**  
為使上述範例查詢能夠運作，您必須使用 [ 欄位](configuring-index-fields.md)設定索引`latlon`且您的文件中已有 `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**
+ [設定 Amazon CloudSearch 網域以搜尋 DynamoDB 資料](#searching-dynamodb-data.configuring)
+ [從 DynamoDB 將資料上傳至 Amazon CloudSearch](#searching-dynamodb-data.uploading)
+ [將搜尋網域與 DynamoDB 資料表同步](#searching-dynamodb-data.sync)

## 設定 Amazon CloudSearch 網域以搜尋 DynamoDB 資料
<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>

您可以使用 Amazon CloudSearch 主控台來分析來自 DynamoDB 資料表的資料，以設定搜尋網域。無論資料表大小如何，從資料表讀取的資料最多為 5 MB。根據預設，Amazon CloudSearch 會從資料表開頭讀取 。您可以指定起始索引鍵，從某一特定項目開始讀取。

**使用 DynamoDB 資料表設定搜尋網域**

1. 開啟位於 https：//[https://console.aws.amazon.com/cloudsearch/home](https://console.aws.amazon.com/cloudsearch/home) 的 Amazon CloudSearch 主控台。

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 會將其轉換為文件批次，以便對其進行索引。您要由網域組態選擇為各項屬性定義索引欄位。如需詳細資訊，請參閱[設定 Amazon CloudSearch 網域以搜尋 DynamoDB 資料](#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 位元的未簽署整數：
  + 如果數字屬性包含小數值，將僅存放其值的整數部分。小數點右邊的部分一概捨棄。
  + 如果值過大而無法存放為不帶正負號的整數，將截斷其值。
  + 負整數將視為不帶正負號的正整數。

### 透過 Amazon CloudSearch 主控台將 DynamoDB 資料上傳至網域
<a name="searching-dynamodb-data-console"></a>

您可以使用 Amazon CloudSearch 主控台，將最多 5 MB 的資料從 DynamoDB 資料表上傳至搜尋網域。

**使用主控台上傳 DynamoDB 資料**

1. 開啟位於 https：//[https://console.aws.amazon.com/cloudsearch/home](https://console.aws.amazon.com/cloudsearch/home) 的 Amazon CloudSearch 主控台。

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 資料表的變更和新增，您可以建立個別的更新資料表來追蹤您正在搜尋的資料表變更，並定期將更新資料表的內容上傳至對應的搜尋網域。

若要從搜尋網域移除文件，您必須產生並上傳含有每一份刪除的文件各項刪除操作的文件批次。其中一個選項是使用單獨的 DynamoDB 資料表來追蹤已刪除的項目、定期處理資料表以產生批次刪除操作，並將批次上傳至您的搜尋網域。

為確保在初次資料上傳過程中不致遺失任何所做的變更，您必須於初次資料上傳之前開始收集各項追蹤變更。雖然您可以使用相同的資料更新一些 Amazon CloudSearch 文件，但您可以確保不會遺失任何變更，而且您的搜尋網域包含每個文件up-to-date。

您應同步更新的頻率取決於變更量的多寡以及您容許更新延遲的程度。其中一種方法是累積一段固定期間的變更，並於該期間結束時上傳各項變更及刪除該期間的追蹤資料表。

例如，若為每天同步一次變更及新增內容，您可以在每天凌晨建立一個名為 updates\$1YYYY\$1MM\$1DD 的資料表來收集當天的更新。於當天結束時，再將 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>

查詢延遲狀況直接與符合的文件份數成正比。比對大部分文件的搜尋通常最為費時。

去除以下兩類經常產生大量相符文件的搜尋將可大幅提升整體效能：
+ 比對主體內每一份文件的查詢 (`matchall`)。這雖是列出網域內所有文件的便捷方法，卻也是最耗費資源的查詢。如果您有大量文件，這不僅會導致其他請求逾時，甚至就連其本身也可能逾時。
+ 僅指定一兩個字元的字首 (萬用字元) 搜尋。若您使用這類搜尋隨著使用者輸入而提供即時結果，請等到使用者至少輸入了兩個字元之後再開始提交請求並顯示可能的相符項目。

如要減少符合請求條件的文件份數，您還可以執行下列事項：
+ 將不相關的單詞從您的主體去除以免用於進行比對。最簡單的方法是將其加入至您所使用的分析方案，列為停用詞清單字典項目。或者，您可以預先處理您的資料，剔除不相關的單詞。去除不相關的單詞亦有利於縮減索引的大小，進而降低成本。
+ 使用 `fq` 參數根據特定欄位的值明確篩選結果。

若您仍有請求需要比對大量文件，則可透過盡量減少對結果集進行處理的量以降低延遲：
+ 將您所請求的面向資訊減至最少。產生面向數量會增加處理請求所需的時間，並使其他請求發生逾時的可能性提高。如果您肯定要請求面向資訊，請切記指定的面向愈多，處理請求所需的時間會愈久。
+ 避免使用自行撰寫的運算式進行排序。對結果進行排序所需的額外處理量會使請求發生逾時的可能性提高。如果您必須自訂結果的排序方式，使用欄位通常會比使用運算式更有效率。

請切記，由搜尋結果傳回大量資料可能會增加傳輸時間並影響查詢延遲。盡量減少您所使用的傳回欄位數目，以便提升效能並縮減索引的大小。

### 簡化結構式查詢
<a name="simplifying-structured-queries"></a>

查詢條件指定的字句愈多，處理查詢所需的時間會愈久。

若您使用複雜的結構式查詢但執行效果不佳，即必須設法減少字句數目。在某些情況下，您或許只需要設定限制或重新建構查詢就能解決問題。不過有些時候，您可能必須修改網域組態以適應更簡單的查詢。