Redisearch实现餐厅按距离排序的模糊匹配查询求助
Redisearch实现餐厅名称模糊匹配+按地理距离排序的解决方案
问题背景
我在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不使用SQL的
%%,而是用*作为通配符 - 地理字段类型错误:如果
location字段未配置为GEO类型,无法按地理距离排序,SORTBY location ASC只会按字符串排序 - 未指定距离计算原点:直接按
location排序无法触发地理距离计算逻辑
正确实现步骤
1. 确保索引字段配置正确
首先要创建包含正确字段类型的索引(假设餐厅数据以Redis哈希存储,前缀为restaurant:):
FT.CREATE restaurant_idx ON HASH PREFIX 1 "restaurant:" SCHEMA name TEXT # 配置为TEXT类型,支持模糊匹配 location GEO # 必须配置为GEO类型,才能处理地理距离计算 address TEXT uid TAG
2. 正确的查询命令写法
场景1:匹配名称含指定关键词+按距离排序(不限定范围)
FT.SEARCH restaurant_idx "@name:*burger*" SORTBY location BYDISTANCE ASC GEOORIGIN -75.153270 39.949655
@name:*burger*:匹配名称中包含burger的所有餐厅(*代表任意长度的字符)GEOORIGIN:指定计算距离的原点坐标(经度在前,纬度在后)SORTBY location BYDISTANCE ASC:按到原点的地理距离升序排序
场景2:匹配名称含指定关键词+限定地理范围+按距离排序
如果需要只返回指定坐标100公里范围内的餐厅,可使用GEOFILTER:
FT.SEARCH restaurant_idx "@name:*burger*" GEOFILTER location -75.153270 39.949655 100 km SORTBY location BYDISTANCE ASC
GEOFILTER location <lon> <lat> <radius> <unit>:过滤出原点指定半径内的结果,单位支持km(公里)、m(米)等
内容的提问来源于stack exchange,提问作者Yousif Basim
相关产品推荐
相关产品推荐

