我的 Redis 数据库中有餐厅集合,餐厅对象存储如下:
{
uid: "T8957Ixo1kRjtw3Nof3Ttase",
name: "Restaurant name",
address:
"751 S 10th St, Philadelphia, Pennsylvania 19140, United States",
location: "-78.15096902,38.94039013",
}
我想知道是否可以返回按距离排序的结果
我试着做
FT.SEARCH index "@name:%%burger%% @location:[-75.153270 39.949655]" SORTBY location ASC
但是根本不起作用,我怎样才能通过redisearch实现这一目标?
目前,这只能通过
FT.AGGREGATE
实现。您必须使用 APPLY
(此处的文档),然后按其排序。
尝试类似:
FT.AGGREGATE index "@name:%%burger%%" APPLY "geodistance(@location, -75.153270, 39.949655)" AS distance SORTBY distance ASC
文档中还有一些其他
geodistance
的重载,您可以使用最适合您环境的一个。
此外,您应该再看一下GEO 过滤器语法。您的查询无效:
地理过滤器
从 v0.21 开始,可以使用语法 @field:[{lon} {lat} {radius} {m|km|mi|ft}] 将地理半径查询直接添加到查询语言中。这会将结果过滤到从经纬度点开始的给定半径(以米、公里、英里或英尺为单位定义)。有关更多详细信息,请参阅 Redis 自己的 GEORADIUS 命令,因为它是内部使用的)。
半径过滤器可以像数字过滤器一样添加到查询中。例如,在企业数据库中,查找旧金山附近(半径5公里以内)的中餐馆将表示为:中餐馆@location:[-122.41 37.77 5 km]。
我建议的查询可以工作,但是如果您可以给出相关的半径来查看,您可能会获得更好的性能。
例如:
FT.AGGREGATE index "@name:%%burger%% @location:[-75.153270 39.949655 5 km]" APPLY "geodistance(@location, -75.153270, 39.949655)" AS distance SORTBY distance ASC
将搜索限制在5公里半径内。
希望有帮助!