MySQL和MariaDB的向量搜索:Neighbor二进制向量实战教程

MySQL和MariaDB的向量搜索:Neighbor二进制向量实战教程

MySQL和MariaDB的向量搜索:Neighbor二进制向量实战教程

【免费下载链接】neighborNearest neighbor search for Rails项目地址: https://gitcode.com/gh_mirrors/ne/neighbor

Neighbor是一款专为Rails设计的最近邻搜索工具,支持MySQL和MariaDB等多种数据库的向量搜索功能。本文将详细介绍如何使用Neighbor在MySQL和MariaDB中实现高效的二进制向量搜索,帮助开发者轻松构建高性能的相似性检索系统。

为什么选择二进制向量?

二进制向量(Binary Vectors)是一种高效的向量表示方式,它将浮点数向量转换为二进制形式存储,具有以下优势:

  • 存储空间小:二进制向量比传统浮点向量节省8-32倍存储空间
  • 计算速度快:使用汉明距离(Hamming Distance)计算相似度,运算效率更高
  • 索引效率高:适合构建高效的向量索引,提升查询性能

Neighbor为MySQL和MariaDB提供了完整的二进制向量支持,让开发者能够轻松集成这一强大功能。

环境准备

系统要求

  • MariaDB 11.8+ 或 MySQL 9.7+(搜索功能需要HeatWave支持)
  • Rails 8.1+
  • Ruby 3.0+

安装Neighbor

在Rails项目的Gemfile中添加:

gem "neighbor"

然后运行:

bundle install

MariaDB二进制向量实现

创建二进制向量列

MariaDB使用bigint类型存储二进制向量,最多支持64个维度。创建迁移文件:

class AddEmbeddingToItems < ActiveRecord::Migration[8.1] def change add_column :items, :embedding, :bigint end end

运行迁移:

rails db:migrate

配置模型

在模型中添加Neighbor支持:

class Item < ApplicationRecord has_neighbors :embedding end

存储二进制向量

将二进制向量表示为整数存储:

# 存储二进制向量 "101"(对应整数5) item.update(embedding: 5)

执行相似性搜索

使用汉明距离查找最近邻:

# 查找与向量5(二进制101)最相似的5个项目 Item.nearest_neighbors(:embedding, 5, distance: "hamming").first(5)

创建向量索引

为提升查询性能,添加向量索引(注意向量列必须设置null: false):

class CreateItems < ActiveRecord::Migration[8.1] def change create_table :items do |t| t.vector :embedding, limit: 3, null: false t.index :embedding, type: :vector end end end

MySQL二进制向量实现

创建二进制向量列

MySQL使用binary类型存储二进制向量,创建迁移文件:

class AddEmbeddingToItems < ActiveRecord::Migration[8.1] def change add_column :items, :embedding, :binary end end

运行迁移:

rails db:migrate

配置模型

在模型中添加Neighbor支持:

class Item < ApplicationRecord has_neighbors :embedding end

存储二进制向量

将二进制向量表示为字节字符串存储:

# 存储二进制向量 "\x05"(对应二进制101) item.update(embedding: "\x05")

执行相似性搜索

使用汉明距离查找最近邻:

# 查找与向量"\x05"最相似的5个项目 Item.nearest_neighbors(:embedding, "\x05", distance: "hamming").first(5)

支持的距离度量

Neighbor为MySQL和MariaDB提供了多种距离度量方式:

  • Euclidean:欧氏距离,适用于连续向量
  • Cosine:余弦相似度,适用于方向相似性比较
  • Hamming:汉明距离,专门用于二进制向量

在查询时通过distance参数指定:

# 使用余弦相似度 Item.nearest_neighbors(:embedding, vector, distance: "cosine").first(5)

实际应用示例

文本相似性搜索

使用二进制向量实现文本相似性搜索:

  1. 将文本转换为二进制向量(可使用Cohere等服务的ubinary嵌入)
  2. 存储二进制向量到数据库
  3. 对查询文本进行同样处理,然后搜索最近邻
# 伪代码示例 def embed_text(text) # 调用嵌入API将文本转换为二进制向量 response = Net::HTTP.post(URI("https://api.cohere.com/v2/embed"), { texts: [text], model: "embed-v4.0", embedding_types: ["ubinary"] }.to_json, headers) JSON.parse(response.body)["embeddings"]["ubinary"].first end # 存储文本嵌入 document = Document.create(content: "The dog is barking", embedding: embed_text("The dog is barking")) # 搜索相似文本 query_embedding = embed_text("A canine is making noise") similar_documents = Document.nearest_neighbors(:embedding, query_embedding, distance: "hamming").first(5)

推荐系统

使用二进制向量构建简单的推荐系统:

# 为产品创建嵌入 product = Product.create(name: "Wireless Headphones", embedding: product_embedding) # 查找相似产品 similar_products = product.nearest_neighbors(:embedding, distance: "hamming").first(5)

性能优化技巧

  1. 合理设置维度:根据实际需求选择合适的向量维度,避免维度灾难
  2. 使用索引:为向量列创建索引,显著提升查询速度
  3. 批量操作:使用批量插入和更新减少数据库交互次数
  4. 结果限制:使用first(5)等限制返回结果数量,减少数据传输

常见问题解决

向量维度不匹配

确保所有向量具有相同的维度,可在模型中指定:

class Item < ApplicationRecord has_neighbors :embedding, dimensions: 32 # 指定32维 end

索引创建失败

MariaDB向量索引要求列设置null: false

add_column :items, :embedding, :bigint, null: false

MySQL搜索功能不可用

MySQL的DISTANCE()函数仅在HeatWave中可用,确保你的MySQL环境已启用HeatWave。

总结

Neighbor为MySQL和MariaDB提供了强大而简洁的二进制向量搜索功能,让开发者能够轻松构建高性能的相似性检索系统。通过本文介绍的方法,你可以快速在Rails项目中集成二进制向量搜索,为用户提供更智能、更高效的体验。

无论是文本相似性搜索、推荐系统还是其他需要相似性比较的场景,Neighbor的二进制向量功能都能为你提供出色的性能和易用性。现在就尝试在你的项目中使用Neighbor,开启高效向量搜索之旅吧!

【免费下载链接】neighborNearest neighbor search for Rails项目地址: https://gitcode.com/gh_mirrors/ne/neighbor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考