

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon CloudSearch での地理的位置による検索および結果のランク付け
<a name="searching-locations"></a>

`latlon` フィールドを使用してドキュメントデータに位置情報を保存する場合、Amazon CloudSearch の式で `haversin` 関数を使用して 2 つの位置の距離を計算できます。ドキュメントデータと共に位置情報を保存することによって、簡単に特定の地域内の検索を実行することもできます。

**Topics**
+ [Amazon CloudSearch での地域内の検索](#within-area)
+ [Amazon CloudSearch での距離による結果のソート](#sorting-by-distance)

## Amazon CloudSearch での地域内の検索
<a name="within-area"></a>

検索ドキュメントに位置情報を関連付けるには、10 進表記を使用して `latlon` フィールドに位置の緯度と経度を保存できます。値はカンマ区切りリスト `lat,lon` で指定され、例えば、`35.628611,-120.694152` のように指定します。ドキュメントと位置情報を関連付けることによって、`fq` パラメータを使って、簡単に検索ヒットを特定の地域に制限することができます。

**境界ボックスを使用して結果を特定の地域に制限するには**

1. 対象とする地域の左上隅と右下隅の緯度と経度を特定します。

1. その境界ボックスの座標を使用して、一致するドキュメントをフィルタするには、`fq` パラメータを使用します。例えば、各ドキュメントに `location` フィールドを含める場合、`fq=location:['nn.n,nn.n','nn.n,nn.n'] ` のように境界ボックスフィルタを指定することができます。次の例では、*restaurant* の一致がフィルタされ、カリフォルニア州パソロブレス市​のダウンタウンエリア内の一致のみが結果に含まれます。

   ```
   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` 関数をサポートします。この関数は、各点の緯度と経度を使用して、球上の 2 つのポイント間の大円距離を計算します。(詳細については、[半正矢関数の公式](http://en.wikipedia.org/wiki/Haversine_formula)を参照してください)。結果の距離は km 単位で返されます。

一致する各ドキュメントとユーザーとの距離を計算するには、ユーザーの位置情報を `haversin` 関数に渡し、`latlon` フィールドに保存されたドキュメントの位置情報を参照します。10 進表記でユーザーの緯度と経度を指定し、`latlon` に保存された緯度と経度に、`FIELD.latitude` と `FIELD.longitude` を使ってアクセスします。例えば、`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` など、他の特性を考慮するより複雑な式で距離の値を使用することもできます。以下の例で、2 番目の rank 式では、ドキュメントの計算された `distance` とその関連性 `_score` の両方を使用します。

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

**ヒント**  
これらのサンプルクエリを機能させるには、`latlon`フィールドで[インデックスを設定](configuring-index-fields.md)し、ドキュメント内に `location` データがなければなりません。  

```
{
  "fields": {
    "location": "40.05830,-74.40570"
  }
}
```
このフィールドが存在しない場合、検索を実行すると次のエラーメッセージが表示される可能性があります。  

```
Syntax error in query: field (location) does not exist.
```

式を使用した検索結果のソートの詳細については、「[検索結果の制御](controlling-search-results.md)」を参照してください。