Amazon CloudSearch
開発者ガイド (API バージョン 2013-01-01)

Amazon CloudSearch での地理的位置による検索および結果のランク付け

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

Amazon CloudSearch での地域内の検索

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

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

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

  2. その境界ボックスの座標を使用して、一致するドキュメントをフィルタするには、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 での距離による結果のソート

検索リクエストの一部として式を定義することで、距離によって結果をソートできます。Amazon CloudSearch​ の式は haversin​ 関数をサポートしています。この関数は、各地点の緯度と経度を使用して、球上の 2 地点間の大圏距離を計算します。(詳細については、半正矢関数の公式を参照してください)。 結果の距離は km 単位で返されます。

一致する各ドキュメントとユーザーとの距離を計算するには、ユーザーの位置情報を haversin 関数に渡し、latlon フィールドに保存されたドキュメントの位置情報を参照します。10 進表記でユーザーの緯度と経度を指定し、latlon に保存された緯度と経度に、FIELD.latitudeFIELD.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

明示的にソート方向(desc または asc)を指定する必要があることに注意してください。

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 フィールドでインデックスを設定する必要があり、ドキュメントに location データが必要です。

{ "fields": { "location": "40.05830,-74.40570" } }

このフィールドが存在しない場合、検索を実行すると次のエラーメッセージが表示される可能性があります。

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

式を使用した検索結果のソートの詳細については、「検索結果の制御」を参照してください。