内容提要
2023年谷歌编程之夏为Qdrant向量数据库新增多边形地理过滤功能,此前仅支持圆形和矩形。实现上先用geohash索引筛选候选单元格,再判断点是否在多边形内,并测试了多边形与矩形相交等边界情况。API设计放弃GeoJSON以保持与现有过滤器一致,也未单独增加多多边形类型,因为组合条件已够用。
延伸解读
地理过滤的索引策略
Qdrant 使用 geohash 将位置分组为矩形单元格。查询时,先找出可能与多边形重叠的单元格,再对候选点进行多边形内判断。这种两阶段方法避免检查所有存储位置,提升了查询效率。文章指出,该索引在检查多边形边界前缩小了候选范围,是性能优化的关键。
几何运算的测试重点
实现中需要仔细测试两个几何操作:判断多边形是否与矩形相交,以及点是否在多边形内。虽然 Rust geo 库提供了这些操作,但团队仍需理解其行为并验证边界情况。作者探索了 winding-number 和 ray-casting 算法,并通过视觉测试比较结果,以确保正确性。
API 设计的一致性考量
团队曾考虑使用 GeoJSON 作为接口,但其坐标表示与 Qdrant 现有的圆形和矩形过滤器不同,因此决定保持多边形接口与现有过滤器一致。此外,未单独增加多多边形类型,因为组合多边形条件已足够覆盖用例,增加新类型只会增加 API 复杂性而无必要操作。
Q&A
Qdrant在2023年谷歌编程之夏新增了什么地理过滤功能?
新增了多边形地理过滤功能,此前仅支持圆形和矩形过滤。
Qdrant的多边形地理过滤是如何实现高效查询的?
先用geohash索引筛选出可能重叠的候选单元格,再对候选点逐一判断是否在多边形内,避免检查所有存储位置。
为什么Qdrant的多边形过滤API没有采用GeoJSON格式?
因为GeoJSON的坐标表示与Qdrant现有的圆形和矩形过滤器不一致,为了保持API一致性而放弃。
Qdrant为什么没有单独增加多多边形过滤器?
因为组合多个多边形条件已经能覆盖多多边形的使用场景,单独增加会增加API复杂度且无必要。
实现多边形过滤时重点测试了哪些几何操作?
重点测试了多边形与矩形是否相交,以及点是否在多边形内部,并验证了边界情况。
这个项目对参与者有哪些学习收获?
首次在生产项目中使用Rust,学会了通过小规模可测试的问题理解代码库,并在设计接口时考虑用户任务,增强了讨论和提问的信心。