0

ラムダでクラウド検索を使用していますが、地理問合せ(haversinを使用しています)に問題があります。Cloudsearchジオクエリフィルタ/距離別に制限する

dbに保存されているマーケティング担当者の経度/緯度と比較して、ユーザーの現在の経度/緯度に基づいて近くのデータ(マーケティング担当者)を取得する必要があります。

距離でソートされたすべてのデータを取得することはできますが、距離でフィルタリングすることはできません。クラウド検索でこれを達成する方法をお勧めします。

var params = { 
    query: "matchall", 
    expr:"{\"distance\":\"haversin(13.185474,77.524030,latlon.latitude,latlon.longitude)\"},{\"expr.distance\":{,5}}",   
    queryParser:"structured", 
    sort:"distance asc", 
    return:"id,distance,latlon,_score"}; 

上記のクエリでは、距離と距離でソートされたデータが5または10 kmsに制限されます。

クラウドサーチでは可能でない場合は、他の方法を提案してください(他の方法でハワイに行った場合)。私は限られたkmsの近くのデータを取得する必要があります。

答えて

0

CloudSearchを使用すると、フィルタクエリを適用してバウンディングボックス内のすべてのデータを取得できます(docs)。 CloudSearchにはサークル内の場所を取得するオプションはありません。しかし、すべてのデータが距離でソートされた5kmなどのバウンディングボックス内にある場合、ラムダ関数を使用したCloudSearch結果セットから5kmを超えるデータを簡単に削除できます。だから、解決策は、フィルタークエリをパラメーターに追加し、CloudSearchクエリの結果に対して簡単な後処理を行うことです。

は今バウンディングボックスの座標を計算まず

、あなたがポイントの緯度からの距離distの内のすべてのデータをたいとLNG

。この計算にはgeopointライブラリを使用します。

var GEO = require('geopoint'); 
    var point = new GEO(lat, lng); 
    var points = point.boundingCoordinates(Number(dist), -1, true); //[(SW), (NE)] 
    var SW = points[0]; 
    var NE = points[1]; 

    // GeoPoint expresses the boundingbox via SW, NE. CloudSearch uses NW, SE 
    var NWlat = NE.latitude(); 
    var NWlng = SW.longitude(); 
    var SElat = SW.latitude(); 
    var SElng = NE.longitude(); 

次のステップは、あなたのparamsにfilterqueryを追加することです:

var params = { 
    ... 
    “filterQuery” = latlon:['" + NWlat + "," + NWlng + "','" + SElat + "," + SElng + "'], 
    ... 
} 

今CloudSearchクエリを使用すると、距離順バウンディングボックス内のすべてのポイントを与えます。残っているのは、結果セットから "data> distance"を削除することだけです。

+0

ありがとうございます。しかし、これは効率的な解決策ではないようですが、この場合もページネーションに問題があります。私はtopleftとbottomrightのデータを取ることによってバウンドボックスフィルタクエリを適用しましたが、ハバーンが円とバウンドボックスクエリー適用フィルタを四角で計算するので、いくつかの余分なデータが得られます。 – user3099794