ankane/neighbor

Nearest neighbor search for Rails

Neighbor – Ruby on Rails 的最近邻搜索

是什么

  • 一个 Ruby gem,为 ActiveRecord 模型添加基于向量的相似性搜索功能。它允许您在数据库中存储嵌入(或任何类型的数值向量),并使用常见的距离度量查询 k 个最近的记录。

主要特性

  • 开箱即用支持多种数据库:PostgreSQL(通过 pgvectorcube 扩展)、MariaDB、MySQL(HeatWave)、SQLite,以及 Redis 和 S3 向量的适配器。
  • 支持多种距离函数:欧几里得、余弦、内积、曼哈顿、汉明、杰卡德等,具体取决于后端。
  • 支持广泛的向量类型:全精度(vector)、半精度(halfvec)、二进制(bit/bigint)、稀疏(sparsevec),以及 SQLite 的 int8 向量。
  • 提供精确和近似索引(HNSW、IVFFlat),以加速大规模搜索。
  • 简单的模型 API — 在 ActiveRecord 模型中添加 has_neighbors :embedding,然后在记录或类上直接调用 nearest_neighbors
  • 内置助手支持混合搜索(关键词 + 语义)、稀疏搜索,以及使用 Disco 库的在线推荐。

如何使用

  1. 添加 gem 到您的 Gemfile 并运行 bundle install
  2. 在迁移中创建向量列:vector:cube:binary 等),与您使用的数据库匹配。
  3. 在模型中声明邻居关系,使用 has_neighbors :embedding(可选地指定维度、类型或归一化)。
  4. 填充嵌入 — 可通过外部 API(OpenAI、Cohere)或本地模型(Informers、Transformers.rb)完成。
  5. 查询
    item.nearest_neighbors(:embedding, distance: "euclidean").first(5)
    # 或者
    Item.nearest_neighbors(:embedding, [0.9, 1.3, 1.1], distance: "cosine").first(5)
    
    结果包含 neighbor_distance 属性。

为何重要

  • 无需单独的向量数据库,即可在 Rails 应用中直接实现语义搜索、推荐和基于相似性的功能。
  • 利用底层 SQL 引擎的原生索引能力,将数据和搜索保留在同一系统中。
  • 既适合研究(稀疏向量、半精度),也适合生产(近似索引、MySQL 的 HeatWave)。

典型用例

  • 基于嵌入的文档或产品搜索。
  • 实时基于项目的推荐。
  • 混合关键词 + 语义检索。
  • 任何需要快速相似性查找的 Rails 服务。

资源

  • 完整文档在 README 中,每个支持的后端都有独立章节。
  • OpenAI、Cohere、Informers、混合搜索、稀疏搜索和 Disco 推荐的示例代码。
  • 独立适配器:neighbor-redisneighbor-s3 用于非 SQL 存储。

以上所有细节均直接取自项目的 README。

相关

  • 项目
  • 项目
  • 项目
  • 项目