0

람다에서 클라우드 검색을 사용하고 있습니다. 지역 쿼리에 문제가 있습니다 (haversin 사용).Cloudsearch 지리 쿼리 필터/거리 별 제한

DB에 저장된 마케터 경도/위도와 비교하여 사용자의 현재 경도/위도를 기준으로 가까운 데이터 (마케터)를 가져와야합니다.

거리별로 정렬 된 모든 데이터를 가져올 수 있지만 거리별로 필터링/필터링 할 수 없으므로 cloudsearch로이를 달성하는 방법을 제안하십시오.

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로 제한하려고합니다.

구름 찾기가 불가능한 경우 다른 방법으로 제안하십시오. 제한된 킬로미터로 주변 데이터를 가져와야합니다.

답변

0

CloudSearch를 사용하면 필터 쿼리를 적용하여 경계 상자 내의 모든 데이터를 가져올 수 있습니다 (docs). CloudSearch에는 서클 내 위치를 가져 오는 옵션이 없습니다. 그러나 거리에 따라 정렬 된 경계 상자 (예 : 5km) 내에 모든 데이터가있는 경우 람다 (Lambda) 기능이있는 CloudSearch 결과 세트에서 5km가 넘는 데이터를 쉽게 삭제할 수 있습니다. 따라서 해결책은 필터 쿼리를 매개 변수에 추가하고 CloudSearch 쿼리 결과에 대한 간단한 후 처리를 수행하는 것입니다.

은 이제 경계 상자 좌표를 계산, LNG

먼저 LAT 점 으로부터의 거리 DIST 내의 모든 데이터를한다고 가정합니다. 이 계산에는 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 쿼리 거리상으로 정렬 경계 상자 내에서 당신에게 모든 포인트를 제공 할 것입니다. 남은 유일한 일은 결과 집합에서 "데이터> 거리"를 제거하는 것입니다.

+0

감사합니다. @Peter. 그러나 이것이 효율적인 솔루션 인 것 같지 않으며, 페이지 매김을 적용하는 것은이 경우에 문제가있다. topleft 및 bottomright 데이터를 사용하여 바운드 상자 필터 쿼리를 적용했지만 haversin이 원 및 바운드 상자 쿼리를 기반으로 정사각형으로 계산할 때 추가 데이터를 제공합니다. – user3099794