Cloudsearch地理位置查询过滤器/按距离限制

时间:2016-12-09 10:56:34

标签: node.js amazon-web-services aws-lambda amazon-cloudsearch

我正在使用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)。我需要以有限的公里数获得附近的数据。

1 个答案:

答案 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”