

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

# 在 Amazon CloudSearch 中設定表達式
<a name="configuring-expressions"></a>

您可以定義數值運算式並將其用於對搜尋結果進行排序。運算式亦可隨搜尋結果傳回。您可以將運算式加入至網域組態或由搜尋請求中定義運算式。

**Topics**
+ [撰寫 Amazon CloudSearch 的表達式](#writing-expressions)
+ [query time expressions](defining-expressions-in-requests.md)
+ [在 Amazon CloudSearch 中設定搜尋網域的可重複使用表達式](configuring-reusable-expressions.md)
+ [比較 Amazon CloudSearch 中的表達式](comparing-expressions.md)

## 撰寫 Amazon CloudSearch 的表達式
<a name="writing-expressions"></a>

Amazon CloudSearch 表達式可包含：
+ 啟用排序的單值數值欄位：`int`、`double`、`date`(您必須指定具體欄位，不支援萬用字元)
+ 其他運算式
+ `_score` 變數，其為參考某文件的相關性分數
+ `_time` 變數，其為參考目前的 epoch 時間
+ `_rand` 變數，其將傳回隨機產生的值
+ 整數、浮點數、十六進位和八進位常值
+ 算術運算子：`+ - * / %`
+ 位元運算子：` | & ^ ~ << >> >>>`
+ 布林值運算子 (包括三元運算子)：` && || ! ?: `
+ 比較運算子：` < <= == >= > `
+ 數學函數：`abs ceil exp floor ln log10 logn max min pow sqrt `
+ 三角函數：`acos acosh asin asinh atan atan2 atanh cos cosh sin sinh tanh tan`
+ `haversin` 距離函數

[JavaScript 優先順序規則](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table)適用於運算子。您可以使用括號覆寫運算子優先順序。

評估邏輯表達式時使用捷徑評估 - 如果在評估第一個引數後可以判斷表達式的值，則不會評估第二個引數。例如，運算式 `a || b` 只有在 `a` 為非 true 時才會評估 `b`。

運算式一律會傳回從 0 到 64 位元帶正負號整數值上限 (2^63 - 1) 的整數值。中間結果將計算成雙精度浮點值，而傳回值則捨入到最接近的整數。如果運算式無效或計算結果為負值，即會傳回 0。如果運算式的計算結果大於最大值，則將傳回最大值。

運算式名稱必須以字母開頭，長度至少 3 個字元且不超過 64 個字元。允許的字元如下：a-z (小寫字母)、0-9 和 \$1 (底線)。名稱 *score* 是保留項目，不得做為運算式名稱使用。

例如，假設您為網域定義了一個 `int` 欄位名為 *popularity*，即可使用該欄位搭配預設相關性分數 `_score` 建構自訂運算式。

```
(0.3*popularity)+(0.7*_score)
```

請注意，這個簡單的範例假定熱門程度排名 (popularity) 和相關性分數 (\$1score) 的值大致落在相同的範圍內。若要調整運算式用於將結果排名，您需要進行一些測試，以判定應如何為運算式的元件加權才能獲得您想要的結果。

### 在 Amazon CloudSearch 表達式中使用日期欄位
<a name="using-dates-in-expressions"></a>

`date` 欄位內的值儲存為以毫秒計的 epoch 時間。這表示您可以使用數學運算子和比較運算子，利用存放在文件中的日期和目前的 epoch 時間 (`_time`) 建構運算式。例如，若使用以下運算將電影網域的搜尋結果排序，則最新發行日期的電影將排在清單最上方。

```
_score/(_time - release_date)
```

# 在搜尋請求中定義 Amazon CloudSearch 表達式
<a name="defining-expressions-in-requests"></a>

您可以直接由搜尋請求中定義與使用運算式，讓您能夠快速反覆運算，同時微調用於對結果進行排序的運算式。若由搜尋請求中定義運算式，您還可以將情境資訊納入運算式，例如使用者的地理位置。您可藉著由搜尋請求中定義同名的運算式以覆寫網域組態所定義的運算式。

由搜尋請求中定義的運算式並不會存放於您的網域組態。若想要在其他請求中使用該運算式，每一次的請求都必須定義該運算式，或者將該運算式加入至您的網域組態。由每一次的請求定義運算式而非加入至網域組態會增加請求負擔，以致可能造成回應時間過久進而增加您運行網域的成本。如需如何將運算式加入至網域組態的相關資訊，請參閱[設定運算式](configuring-expressions.md)。

單次搜尋請求可以定義與使用多個運算式。運算式的定義可參考該請求中定義的其他運算式，以及由網域組態所設定的運算式。

由搜尋請求中定義的運算式並無任何用法上的限制。您可以使用運算式對搜尋結果進行排序、定義其他運算式，或由搜尋結果傳回經過計算的資訊。

**由搜尋請求中定義運算式**

1. 使用 `expr.NAME` 參數，其中 NAME 是您要定義的運算式的名稱。例如：

   ```
   expr.rank1=log10(clicks)*_score
   ```

1. 若要使用此運算式對結果進行排序，使用 `sort` 參數指定運算式的名稱：

   ```
   search?q=terminator&expr.rank1=log10(clicks)*_score&sort=rank1 desc
   ```

1. 若要將計算得出的值納入搜尋結果，於 `return` 欄位的清單中加入此運算式：

   ```
   search?q=terminator&expr.rank1=log10(clicks)*_score&sort=rank1 desc&return=rank1
   ```

 例如，以下請求建立兩個運算式用於對結果進行排序，並隨搜尋結果傳回其中一個運算式：

```
search?q=terminator&expr.rank1=sin( _score)&expression.rank2=cos( _score)&sort=rank1 desc,rank2 desc&return=title,_score,rank2
```

# 在 Amazon CloudSearch 中設定搜尋網域的可重複使用表達式
<a name="configuring-reusable-expressions"></a>

若您透過網域的組態定義運算式，即可由任何搜尋請求中參考該運算式。將運算式加入至網域組態可減輕每一次請求皆須指定的負擔，且有助於盡量縮短回應時間降低成本。

當您將運算式加入至網域組態，處理變更以使新運算式生效需要一些時間。若要快速測試對運算式所做的變更，您可以依照[由搜尋請求中定義運算式](defining-expressions-in-requests.md)所述，直接由搜尋請求中定義與使用該運算式。完成對運算式的測試和調校之後，您應將其加入至您的網域組態。

**Topics**
+ [Amazon CloudSearch console](#configuring-expressions-console)
+ [aws cloudsearch define-expression](#configuring-expressions-clt)
+ [DefineRankExpression](#configuring-expressions-sdk)

## 使用 Amazon CloudSearch 主控台設定表達式
<a name="configuring-expressions-console"></a>

**設定運算式**

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

1. 從左側導覽窗格中，選擇**網域**。

1. 選擇網域名稱以開啟其組態。

1. 前往**進階搜尋選項**索引標籤。

1. 在**表達式**窗格中，選擇**新增表達**式。

1. 輸入新表達式的名稱。

1. 針對**值**，輸入您要在搜尋時間評估的數值表達式。您可以選取**插入**來新增特殊值，以及數學和三角函數。

1. 選擇**儲存**。

## 使用 設定 Amazon CloudSearch 表達式 AWS CLI
<a name="configuring-expressions-clt"></a>

使用 `aws cloudsearch define-expression` 命令即可為網域定義運算式進行計算。

**設定運算式**
+ 執行 `aws cloudsearch define-expression` 命令，定義新運算式。使用 `--name` 選項指定運算式的名稱，並使用 `--expression` 選項指定您要評估的數值運算式。例如，以下請求建立一個運算式名為 `popularhits`，將文件的熱門程度 `popularity` 和相關性分數 `_score` 納入考量。

  ```
  aws cloudsearch define-expression --domain-name movies --name popularhits --expression '((0.3*popularity)/10.0)+(0.7* _score)'
  
  {
      "Expression": {
          "Status": {
              "PendingDeletion": false, 
              "State": "Processing", 
              "CreationDate": "2014-05-01T01:15:18Z", 
              "UpdateVersion": 52, 
              "UpdateDate": "2014-05-01T01:15:18Z"
          }, 
          "Options": {
              "ExpressionName": "popularhits", 
              "ExpressionValue": "((0.3*popularity)/10.0)+(0.7* _score)"
          }
      }
  }
  ```

## 使用 Amazon CloudSearch 組態 API 設定表達式
<a name="configuring-expressions-sdk"></a>

AWS SDKs (Android 和 iOS SDKs除外） 支援 Amazon CloudSearch 組態 API 中定義的所有 Amazon CloudSearch 動作，包括 `DefineExpression`。如需安裝與使用 AWS 開發套件的詳細資訊，請參閱 [AWS 軟體開發套件](https://aws.amazon.com/code)。

# 比較 Amazon CloudSearch 中的表達式
<a name="comparing-expressions"></a>

 您可以使用 Amazon CloudSearch 主控台來比較運算式，並查看運算式和欄位權重的變更如何影響 Amazon CloudSearch 排序搜尋結果的方式。

**比較運算式**

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

1. 在左側導覽窗格中選擇 **Domains** (網域)。

1. 選擇網域名稱以開啟其組態。

1. 選擇**動作**、**比較表達式**。

1. 在**搜尋**方塊中，輸入您要搜尋的詞彙。Amazon CloudSearch 會使用指定的表達式和權重對搜尋結果進行排名。每當您變更表達式或權重時，它會重新整理結果。

1. 在每個表達式編輯器中，指定要比較的排名表達式。您可以新增表達式，或從**已儲存表達式功能表中選取現有的表達**式。當您提交搜尋請求時，Amazon CloudSearch 會評估新的表達式。

1. 指定要用於每個表達式的欄位權重。您也可以直接從運算式中編輯欄位權重。欄位權重必須在 0.0 到 10.0 (含) 的範圍內。所有欄位的權重預設為 1.0。您可以設定個別的欄位權重，來控制特定文字或常值欄位影響文件相關性分數的符合度。您也可以變更預設權重。
**注意**  
如果運算式參考 `_score` 值，調整欄位權重只會影響結果的排名。您可以修改運算式，變更權重相關性 `_score` 計入文件整體排名的方式。如需詳細資訊，請參閱[使用欄位相對權重自訂文字相關性](weighting-fields.md)。

1. 選擇**執行**。

1. 兩個運算式的搜尋結果會並排顯示 (如果運算式是空的，結果將依預設相關性分數 `_score` 排序)。四種圖示突顯其間差異：  
![\[Green upward-pointing arrow icon indicating an increase or positive trend.\]](http://docs.aws.amazon.com/zh_tw/cloudsearch/latest/developerguide/images/cloudsearch-console-green-up-arrow.png) 綠色向上箭頭  
 文件使用第二個運算式在搜尋結果中的排名較高。  
![\[Red downward-pointing arrow icon indicating a download or direction.\]](http://docs.aws.amazon.com/zh_tw/cloudsearch/latest/developerguide/images/cloudsearch-console-red-down-arrow.png) 紅色向下箭頭  
 文件使用第二個運算式在搜尋結果中的排名較低。  
![\[Yellow plus sign icon typically used to indicate an add or create action.\]](http://docs.aws.amazon.com/zh_tw/cloudsearch/latest/developerguide/images/cloudsearch-console-yellow-plus.png) 黃色加號  
 文件使用第二個運算式將納入搜尋結果，但若使用第一個運算式則會從搜尋結果剔除。  
![\[Red circular sign with a white horizontal bar, indicating prohibition or restriction.\]](http://docs.aws.amazon.com/zh_tw/cloudsearch/latest/developerguide/images/cloudsearch-console-red-minus.png) 紅色減號  
 文件使用第二個運算式將從搜尋結果剔除，但若使用第一個運算式則會納入搜尋結果。

**注意**  
您可以從比較表達式窗格直接將**表達**式儲存到您的網域組態。若要儲存任一表達式，請選擇**儲存表達式**。