Qdrant

Google Summer of Code 2023 - Polygon Geo Filter for Qdrant Vector Database

8.5内容质量

TL;DR · AI 摘要

Qdrant 在 2023 年 Google Summer of Code 中新增了多边形地理过滤功能,提升向量数据库的地理查询能力。

核心要点

  • Qdrant 新增多边形地理过滤功能,提升查询灵活性。
  • 使用 GeoHash 分层结构优化地理查询性能。
  • 采用 Ray Casting 算法判断点与多边形关系。

结构提纲

按章节快速跳转。

  1. 介绍作者参与 Google Summer of Code 项目,开发 Qdrant 多边形地理过滤功能。

  2. 说明地理过滤功能的使用场景和 Qdrant 当前功能的局限性。

  3. 解释 Qdrant 内部使用 GeoHash 分层结构进行地理计算的原理。

  4. 描述对 GeoHash 算法进行测试和验证的过程,包括 Ray Casting 算法的使用。

  5. 介绍在项目中对 Proto 和 JSON 格式设计的深入研究和优化。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Qdrant 多边形地理过滤功能
    • 技术挑战
      • GeoHash 分层结构
      • 多边形与矩形相交判断
      • 点在多边形内判断
    • 实现方法
      • 使用 Ray Casting 算法
      • Proto 和 JSON 格式设计

金句 / Highlights

值得收藏与分享的关键句。

#Qdrant#向量数据库#地理过滤#GeoHash#Rust
打开原文

Google Summer of Code 2023 - Qdrant 向量数据库的多边形地理过滤器

返回 Qdrant 文章

Zein Wen

·

2023 年 10 月 12 日

介绍

大家好,我是 Zein Wen,我是 Qdrant 的 Google Summer of Code 2023 参与者。我有幸与一位非常优秀的导师 Arnaud Gourlay 合作,共同增强 Qdrant 的地理多边形过滤器功能。这个新功能允许用户使用多边形来进一步细化查询结果。作为地理过滤器家族中半径和矩形过滤器的最新补充,这一增强功能为查询地理数据提供了更大的灵活性,开启了有趣的全新使用场景。

项目概述

地理过滤器的使用案例(https://traveltime.com/blog/map-postcode-data-catchment-area)

由于 Qdrant 是一个功能强大的向量查询数据库,它为机器学习驱动的应用程序(如推荐系统)提供了巨大的潜力。然而,仅靠向量查询的范围可能并不总是能满足用户的需求。设想一下,当你寻找餐厅推荐时,你不仅仅想要一份餐厅列表,而是那些位于你社区内的餐厅。这就是地理过滤器发挥作用的地方,通过引入额外的过滤条件来增强查询。在此之前,Qdrant 的地理过滤选项仅限于圆形和矩形,这可能无法与现实世界中多样的边界相匹配。这种场景正是用户提出功能请求的原因,我们决定解决这个问题,因为它为与地理相关的查询引入了更大的能力。

技术挑战

  1. 地理几何计算

地理空间基本概念

内部的地理过滤器不会从测试每个单独的地理位置开始,因为这在计算上会非常昂贵。相反,我们创建了一个地理哈希层,将世界划分为矩形。当为 Qdrant 条目创建空间索引时,它会将条目分配给其位置的地理哈希。

在查询过程中,我们首先识别所有满足过滤条件的潜在地理哈希,然后在这些哈希中检查位置候选者。完成此搜索涉及两个关键的几何计算:

  • 确定多边形是否与矩形相交
  • 确定一个点是否位于多边形内。

几何计算测试

虽然我们有一个 geo crate(一个 Rust 库),它为这些计算提供了 API,但我们深入研究了底层算法并验证了它们的准确性。这引导我们进行了广泛的测试和可视化以确定正确性。除了评估当前的 crate,我们还发现有多种算法可用于这些计算。我们投入时间探索了不同的方法,如 winding windows 和 ray casting,以理解它们的区别,并为未来的改进铺平道路。

通过这个过程,我享受到了快速掌握陌生概念的能力。此外,我还需要开发分析策略,以剖析并从中得出有意义的结论。这种经验对扩展我的问题解决工具包非常宝贵。

  1. Proto 和 JSON 格式设计

为这个新功能设计 ProtoBuf 和 JSON 接口投入了大量努力。这个组件直接暴露给用户,需要一个一致且用户友好的接口,这反过来有助于提升用户体验并减少未来代码的修改。

最初,我们考虑将接口与 GeoJSON 规范对齐,因为它是许多与地理相关的 API 的标准。然而,我们很快意识到 GeoJSON 定义几何的方式与我们当前用于点半径和矩形过滤器的 JSON 和 ProtoBuf 坐标定义存在显著差异。因此,我们优先考虑 API 层面的一致性和用户体验,选择将新的多边形定义与我们现有的所有定义保持一致。

此外,我们原本计划除了多边形之外,再开发一个独立的多边形过滤器。然而,经过仔细考虑后,我们认识到,对于我们的使用场景,多边形过滤器可以实现与多边形过滤器相同的效果。这种关系与我们目前处理多个圆形或矩形的方式类似。因此,我们认为多边形过滤器是多余的,会为 API 增加不必要的复杂性。

完成这项工作让我认识到,在现实世界中寻找解决方案时,要在遵循既定标准和优先考虑用户体验之间找到平衡是一项挑战。同时,这也让我更加理解了专注于开发用户真正需要的功能的重要性,而不是过度扩展我们的努力。

成果

  1. 深入探索的能力

能够在不熟悉的代码库、概念、API 和技术中深入探索,是开发人员常见的挑战。参与 GSoC 对我来说就像从游泳池的安全区域直接跳入了广阔的海洋。在这个转变过程中,导师的支持是无价的。他为我提供了许多独立探索之前从未接触过的领域的机会。我逐渐不再害怕未知的技术领域,无论是不熟悉的代码、特定领域中的技术还是概念。我对自己逐步学习并运用它们来实现自己设想的能力充满了信心。

  1. 始终以用户为中心

我学到的另一个重要教训是,考虑用户体验及其具体使用场景的重要性。虽然开发过程中可能涉及迭代过程,但所有直接影响用户的功能都必须以同理心来处理和执行。忽视这一点不仅可能导致功能错误,还可能因为不一致和困惑而削弱用户的信任,最终导致他们不再使用我的工作成果。

  1. 勇于表达并有效沟通

最后,在开发过程中,遇到不同意见是常见的事情。保持对他人想法的开放态度,同时也要有清晰表达自己观点的决心,这是至关重要的。这有助于促进富有成效的讨论,最终提升开发过程的质量。

总结

被选中参与 Google Summer of Code 2023,并与 Arnaud 和其他 Qdrant 工程师以及所有社区成员合作,是一次真正的荣幸。我非常感激那些花时间审查我的代码、讨论替代方案和设计选择、并在需要时提供帮助的人。通过这些互动,我亲身经历了开源的本质和鼓励协作的文化。这次经历不仅让我第一次为真实产品编写了 Rust 代码,也让我打开了通往开源世界的大门。

毫无疑问,我渴望继续与这个社区一同成长,并为提升产品的功能和改进做出贡献。我也成为了 Qdrant 的倡导者,向许多同事和科技行业的朋友们介绍了这个项目。我非常期待看到在我的社交圈中涌现出新的用户和贡献者!

如果你想尝试我的工作,请阅读文档,然后注册一个免费的云账户或下载 Docker 镜像。我期待看到人们如何在自己的应用中使用我的工作!