Redis:FT.SEARCH 模糊匹配按与提供坐标的距离排序

问题描述 投票:0回答:1

我的 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实现这一目标?

redis node-redis redisearch
1个回答
0
投票

目前,这只能通过

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公里半径内。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.