基于Geohash与优先队列的商户就近搜索方案
核心思路
通过Geohash将二维地理位置编码为一维字符串实现快速区域筛选,结合优先队列(堆排序)动态维护最近商户列表,平衡计算效率与准确性。
数据预处理阶段
商户数据需提前建立Geohash索引并存储。以MySQL为例,商户表结构设计如下:
CREATE TABLE merchants (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
longitude DOUBLE, -- 经度
latitude DOUBLE, -- 纬度
geohash CHAR(12) -- 9级Geohash约±19米精度
);
CREATE INDEX idx_geohash ON merchants(geohash);
使用Java生成Geohash(依赖commons-codec库):
public static String encodeGeohash(double lat, double lon, int precision) {
GeoHash geoHash = GeoHash.withCharacterPrecision(lat, lon, precision);
return geoHash.toBase32();
}
实时查询阶段
输入参数
用户坐标(userLat, userLon)
,搜索半径radius
(单位:米),返回数量limit
步骤说明
- 计算候选Geohash块
根据半径确定所需Geohash精度级别(如半径500米对应7级编码),获取用户所在块及相邻8个块(Moore邻居):