

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

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