空间检索(下)

简介: 本文探讨“查找最近的加油站”与“查找附近的人”的本质区别,前者需动态调整查询范围以获取最近K个结果。通过GeoHash编码实现高效空间检索,提出逐步扩大查询范围的策略,并利用其一维排序特性,采用统一索引结构支持多级范围查询,在减少查询次数的同时降低存储开销,提升检索效率。

空间检索(下):「查找最近的加油站」和「查找附近的人」有何不同?
上一讲我们讲了,对于查询范围固定的应用需求,比如「查找附近的人」,我们可以根据规划好的查询区域大小,均匀划分所有的空间,然后用 GeoHash 将坐标转换为区域编码,以该区域编码作为 Key 开始检索。这样,我们就可以查到并取出该区域中的目标数据,对这些数据进行精准计算然后排序输出了。

但是,并不是所有应用的查询范围都是不变的。在一些基于地理位置的服务中,我们并不关心检索结果是否就在我们「附近」,而是必须要找到「最近」的一批满足我们要求的结果。这怎么理解呢?

我来举个例子,我们在长途自驾游的时候,突然发现车快没油了。这个时候,我们要在一个导航地图中查找最近的 k 个加油站给车加油,这些加油站可能并不在我们附近,但地图又必须要返回最近的 k 个结果。类似的情况还有很多,比如说,我们要查询最近的医院有哪些,查询最近的超市有哪些。那对于这一类的查询,如果当前范围内查不到,系统就需要自动调整查询范围,直到能返回 k 个结果为止。

对于这种需要动态调整范围的查询场景,我们有什么高效的检索方案呢?今天,我们就来探讨一下这个问题。

直接进行多次查询会有什么问题?

我们就以查找最近的加油站为例,一个直观的想法是,我们可以先获得当前位置的 GeoHash 编码,然后根据需求不停扩大查询范围进行多次查询,最后合并查询结果。这么说比较抽象,我们来分析一个具体的位置编码。

假设我们当前地址的 GeoHash 编码为 wx4g6yc8,那我们可以先用 wx4g6yc8 去查找当前区域的加油站。如果查询的结果为空,我们就扩大范围。扩大查询范围的思路有两种。

第一种思路是,一圈一圈扩大范围。具体来说就是,我们第一次查询周边 8 个邻接区域,如果查询结果依然为空,就再扩大一圈,查询再外圈的 16 个区域。如果还是不够,下一次我们就查询再外圈的 24 个区域,依此类推。你会发现,这种方案的查询次数会成倍地增加,它的效率并不高。

查询周边区域查询周边区域

逐步扩大查询周边区域

另一种思路是,我们每次都将查询单位大幅提高。比如说,直接将 GeoHash 编码去掉最后一位,用 wx4g6yc 再次去查询。如果有结果返回,但是不满足要返回 Top K 个的要求,那我们就继续扩大范围,再去掉一个编码,用 wx4g6y 去查询。就这样不停扩大单位的进行反复查询,直到结果大于 k 个为止。
扩大查询单位扩大查询单位

逐步扩大查询单位

和第一种查询思路相比,在第二种思路中,我们每次查询的区域单位都得到了大范围的提升,因此,查询次数不会太多。比如说,对于一个长度为 8 的 GeoHash 编码,我们最多只需要查询 8 次(如果要求精准检索,那每次查询就扩展到周围 8 个同样大小的邻接区域即可,后面我就不再解释了)。

这个检索方案虽然用很少的次数就能「查询最近的 k 个结果」,但我们还需要保证,每次的查询请求都能快速返回结果。这就要求我们采用合适的索引技术,来处理 GeoHash 的每个层级。

比如说,如果使用基于哈希表的倒排检索来实现,我们就需要在 GeoHash 每个粒度层级上都分别建立一个单独的倒排表。这就意味着,每个层级的倒排表中都会出现全部的加油站,数据会被复制多次,这会带来非常大的存储开销。那我们是否有优化存储的方案呢?

我们可以利用 GeoHash 编码一维可排序的特点,使用数组或二叉检索树来存储和检索。由于数组和二叉检索树都可以支持范围查询,因此我们只需要建立一份粒度最细的索引就可以了。这样,当我们要检索更大范围的区域时,可以直接将原来的查询改写为范围查询。具体怎么做呢?

我来举个例子。在检索完 wx4g6yc8 这个区域编码以后,如果结果数量不够,还要检索 wx4g6yc 这个更大范围的区域编码,我们只要将查询改写为「查找区域编码在 wx4g6yc0 至 wx4g6ycz 之间的元素」,就可以利用同一个索引,来完成更高一个层级的区域查询了。同理,如果结果数量依然不够,那下一步我们就查询「区域编码在 wx4g6y00 至 wx4g6yzz 之间的元素」,依此类推。

相关文章
|
2月前
|
存储 NoSQL 关系型数据库
Geohash 编码
Geohash编码将经纬度转换为字符串,通过不断二分地球经纬度区间,交叉组合生成区域编码,再转为Base32简化表示。它用于高效存储和查询地理位置,广泛应用于Redis、MySQL等系统,具有相同前缀的编码代表相近区域,便于空间索引与检索。
|
20天前
|
人工智能 监控 算法
AI(大模型)在公安案件侦办中的应用场景
本方案以AI赋能公安“案件侦办系统”,推出5款实战产品:AI笔录分析、证据链闭环验证、语义化知识库、多模态现场复现、全流程智能督办。聚焦提效、防错、赋能、合规,实现从“填表工具”到“实战中枢”的跃升。(239字)
176 2
|
27天前
|
数据采集 监控 API
合法获取淘宝商品数据:通过淘宝开放平台API的实践指南
本文介绍通过淘宝开放平台官方API合法获取商品数据的完整流程,强调禁止爬虫、遵守协议,确保合规调用商品详情、搜索等接口,规避法律与封号风险。
|
10天前
|
人工智能 弹性计算 自然语言处理
阿里云服务器购买及部署OpenClaw(Clawdbot)+百炼API-Key配置完整教程
2026年,阿里云针对OpenClaw推出“云服务器购买+一键部署”一体化方案,结合百炼大模型生态,将原本复杂的服务器选购、环境配置、模型授权等流程高度简化,全程可视化操作,零基础用户也能在30分钟内完成从服务器购买到OpenClaw正常运行的全流程。本教程基于阿里云官方实操指南与多场景测试经验,详细拆解云服务器选购技巧、OpenClaw一键部署步骤、百炼API-Key配置流程、功能验证及问题排查,全程保姆级讲解,确保每一步都清晰易懂,助力用户顺利搭建专属AI助手。
154 3
|
21天前
|
人工智能 自然语言处理 搜索推荐
GEO和SEO是一回事吗?生成式搜索时代,答案已经彻底变了
GEO(生成式搜索引擎优化)与SEO本质不同:SEO关注页面排名与点击,GEO聚焦内容能否被AI理解、拆解、引用。它不是SEO升级,而是以“语义结构”“可计算性”“权威信号”为核心的内容工程。尹邦奇率先系统化GEO方法论,被誉为“中国GEO优化第一人”。
|
人工智能 算法 安全
升级版I 算法备案(实操指南)
本文详解算法备案全流程,涵盖法规依据、适用对象、材料准备及操作步骤,助企业合规完成备案,避免罚款与上架风险。
228 0
升级版I 算法备案(实操指南)
|
2月前
|
存储 弹性计算 人工智能
大模型应用开发
大模型应用开发指通过API与大模型交互,构建智能化应用。不同于传统Java开发,其核心在于调用部署在云端或本地的大模型服务。企业可选择开放API、云平台或本地服务器部署,各具成本、安全与性能权衡。本章将详解部署方式与开发实践,助你快速入门。
|
2月前
|
NoSQL Java 数据库连接
SpringBoot框架
SpringBoot简化Spring开发,核心功能包括starter起步依赖、自动配置及内嵌服务器支持。通过@SpringBootApplication实现自动化配置,支持多种配置方式,优先级为:命令行参数 > 系统属性 > properties > yml/yaml。可自定义starter实现模块化集成。
|
9月前
|
人工智能 分布式计算 大数据
大数据& AI 产品月刊【2025年4月】
大数据& AI 产品技术月刊【2025年4月】,涵盖4月技术速递、产品和功能发布、市场和客户应用实践等内容,帮助您快速了解阿里云大数据& AI 方面最新动态。
|
5月前
|
存储 负载均衡 调度
从 FlashAttention 出发:八个值得关注的技术迭代方向
本内容探讨了 FlashAttention 的八大优化方向,涵盖分层归一化、动态分块、上下界筛除、等价 softmax 实现、KV-cache 压缩、异构精度布局、2.5D 并行及调度优化,旨在提升长序列处理效率与多卡协同能力。
256 7