我正在使用lambda的云搜索,我遇到了地理查询的问题(我使用的是hasrsin)。
我需要根据用户当前的经度/纬度来获取附近的数据(营销人员),与存储在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公里。
如果云搜索不可能,请建议任何其他方式(任何其他方式,然后hasrsin)。我需要以有限的公里数获得附近的数据。
答案 0 :(得分:0)
使用CloudSearch,您可以应用过滤器查询来获取边界框内的所有数据(docs)。 CloudSearch无法获取圈内的位置。但是当你有一个(例如)5 km的边界框内的所有数据,按距离排序时,很容易删除数据>距离具有Lambda函数的CloudSearch结果集5km。因此,您的解决方案是向params添加过滤器查询,并对CloudSearch查询的结果进行简单的后处理。
现在假设你希望距离 dist 的所有数据都来自 lat , 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”