如何在Astra DB中结合类JSON数据实现向量搜索?含Mongoose场景
一、Astra DB中处理类JSON数据并结合向量搜索
Astra DB作为兼容Cassandra的文档型数据库,原生支持类JSON(BSON)结构的动态存储,同时提供向量搜索能力,两者可无缝结合。
1. 准备工作
- 创建集合:无需预定义固定Schema,直接创建集合即可,类JSON结构的字段会自动适配。
- 创建向量索引:为存储向量的字段创建专用索引,指定维度和相似度算法(如余弦相似度)。示例CQL命令:
CREATE VECTOR INDEX idx_doc_embedding ON your_collection(embedding) USING 'cosine' WITH dimensions = 1536; -- 维度需与嵌入模型输出一致,如OpenAI text-embedding-ada-002为1536
2. 存储类JSON数据与向量
直接插入包含嵌套JSON结构和向量的文档,示例CQL:
INSERT INTO your_collection(id, metadata, embedding) VALUES ( 'doc_001', { "title": "Astra DB 向量搜索指南", "category": "database", "tags": ["vector", "cassandra"] }, [0.123, 0.456, ...] -- 模型生成的向量数组 );
其中metadata字段为类JSON嵌套结构,可根据业务需求自由定义。
3. 结合JSON过滤与向量搜索
使用CQL的JSON路径表达式过滤类JSON字段,同时执行近似最近邻(ANN)搜索,示例:
SELECT id, metadata, embedding, similarity_score FROM your_collection WHERE metadata->>'category' = 'database' -- 过滤JSON中的category字段 ORDER BY embedding ANN OF [0.789, 0.101, ...] -- 目标向量 WITH similarity_threshold = 0.7 -- 相似度阈值(可选) LIMIT 10;
->>用于提取JSON字段的字符串值,可灵活实现嵌套字段的过滤。
二、JavaScript应用中通过Mongoose结合Astra DB处理类JSON与向量搜索
Astra DB兼容MongoDB协议,可直接使用Mongoose库操作,同时支持MongoDB风格的向量搜索语法。
1. 环境配置
- 安装依赖:
npm install mongoose
- 连接Astra DB:获取Astra DB的MongoDB连接URI(控制台"Connect"选项卡生成),初始化Mongoose连接:
const mongoose = require('mongoose'); async function connectToAstra() { try { await mongoose.connect('your_astra_mongodb_uri', { useNewUrlParser: true, useUnifiedTopology: true }); console.log('Connected to Astra DB'); } catch (err) { console.error('Connection error:', err); } } connectToAstra();
2. 定义Schema与模型
针对类JSON结构,可使用Mixed类型存储任意嵌套数据,或显式定义嵌套Schema;向量字段定义为数值数组类型:
const documentSchema = new mongoose.Schema({ // 类JSON结构:Mixed支持任意嵌套,也可显式定义字段 metadata: { type: mongoose.Schema.Types.Mixed, required: true }, // 向量字段:维度需与嵌入模型匹配 embedding: { type: [Number], required: true } }); // 建议直接在Astra控制台创建向量索引,确保参数匹配 const Document = mongoose.model('Document', documentSchema);
3. 存储类JSON数据与向量
创建并保存包含嵌套JSON和向量的文档:
async function saveDocument() { const newDoc = new Document({ metadata: { title: "Mongoose操作Astra DB", category: "javascript", author: "dev" }, embedding: [0.234, 0.567, ...] // 嵌入模型生成的向量 }); await newDoc.save(); console.log('Document saved'); } saveDocument();
4. 执行向量搜索结合JSON过滤
使用Mongoose的vectorSearch方法,结合JSON字段过滤,示例:
async function searchDocuments(targetVector) { const results = await Document.find( { 'metadata.category': 'javascript' }, // 过滤JSON中的category字段 { score: { $meta: 'vectorSearchScore' } } // 返回相似度分数 ) .vectorSearch({ queryVector: targetVector, // 目标向量 path: 'embedding', // 向量字段路径 numCandidates: 100, // 候选集大小(平衡精度与性能) limit: 10, // 返回结果数量 index: 'idx_doc_embedding' // 提前创建的向量索引名称 }) .sort({ score: { $meta: 'vectorSearchScore' } }); // 按相似度排序 console.log('Search results:', results); } // 调用搜索:传入模型生成的目标向量 searchDocuments([0.890, 0.121, ...]);
内容的提问来源于stack exchange,提问作者Madhavan
相关产品推荐
相关产品推荐

