You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:53:15