

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

# 在 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 和 \_ (底線)。名稱 *score* 是保留項目，不得做為運算式名稱使用。

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

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

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

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

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

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