我们公司正在使用AWS CloudSearch搜索和检索用户数据。用户数据包含lat,lon类型的字段位置。因此,对于给定的半径和位置,我们应该找到半径范围内的所有用户。如何编写搜索查询来检索所需的数据?
我们使用node.js作为服务器端语言。
请帮忙。
答案 0 :(得分:3)
在cloudsearch中,无法在半径范围内搜索Latlons。您可以按距离订购,但可以在半径内搜索。
因为您希望半径范围内的所有结果。而是创建一个矩形,使其四边接触您想要搜索的圆。现在,您可以在边界框矩形内搜索并返回按距离排序的结果。
缺点是在边界框的角落会有一些结果,所以它们不在圆圈中,但它们会出现在cloudsearch结果中。您可以使用它们以及近似值或根据距离进一步过滤。
以下示例查询执行相同的操作: Q =用户*安培; FQ =位置%3A%5B%2740.628611,-100.694152%27%2725.621966,-66.686706%27%5D&安培; expr.geo = haversin%2838.958687,-77.343149,location.latitude,location.longitude% 29安培;排序=地理%20asc
这里: fq =位置%3A%5B%2740.628611,-100.694152%27,%2725.621966,-66.686706%27%5D --->在边界框内搜索Latlons,即左上角和右下角。
expr.geo = hasrsin%2838.958687,-77.343149,location.latitude,location.longitude%29& sort = geo%20asc --->创建一个表达式,用于计算搜索文档中LatLon与固定点之间的距离(将其作为圆的中心)。并返回按距离排序的结果。
请注意" hasrsin"距离函数计算LatLons之间的距离,作为完美球体上两点之间的距离。
答案 1 :(得分:0)
You want to be ranking results based on the haversin function. That is equivalent to "searching within a radius" except it accounts for the fact that you're actually interested in the distance on the surface of a sphere.
Here is an example of such a query with CloudSearch (from http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-locations.html):
q=restaurant&expr.distance=haversin(35.621966,-120.686706,location.latitude,location.longitude)&sort=distance asc
Your choice of server-side language is irrelevant, as CloudSearch provides only a REST interface. Have a look at the Getting Started guide if you haven't yet. http://docs.aws.amazon.com/cloudsearch/latest/developerguide/getting-started.html
答案 2 :(得分:-1)
您可以使用以下查询:
q=nikhil&expr.distance=haversin(35.621966,-120.686706,latlong.latitude,latlong.longitude)&sort=distance%20asc&return=distance
然后循环每个结果并具有if条件
它非常慢并且需要时间,因为节点将更多地取决于数据,但这是您的问题的一个答案。