如何在C#中对Azure Cosmos DB for MongoDB执行向量搜索?
Azure Cosmos DB for MongoDB 向量搜索的C#实现方案
我正在使用Azure Cosmos DB for MongoDB的向量索引新功能,数据结构定义如下:
public class TextChunk { public string Id { get; set; } = null!; public float[]? TextVectors { get; internal set; } }
按照官方教程创建向量索引后,发现教程只有JavaScript示例,我尝试用C#/.Net执行向量搜索时,调用collection.Aggregate().VectorSearch方法遇到如下错误:
An exception of type 'MongoDB.Driver.MongoCommandException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'Command aggregate failed: Unrecognized pipeline stage name: $vectorSearch.'
我怀疑$vectorSearch管道阶段仅在MongoDB Atlas中可用,想知道在.Net 7、MongoDb.Driver 2.22.0环境下,如何将教程中的JavaScript示例转换为C#代码执行向量搜索?
解决方案
Azure Cosmos DB for MongoDB vCore的向量搜索并不支持MongoDB Atlas的$vectorSearch管道阶段,它采用的是基于$search管道的自定义扩展实现,因此不能直接使用驱动内置的VectorSearch方法,需要手动构造$search管道阶段。
1. 确认向量索引创建正确
确保你创建的向量索引符合Cosmos DB的要求,示例索引创建语句(对应教程中的JavaScript代码)大致如下:
db.textChunks.createIndex( { TextVectors: "cosmosSearch" }, { cosmosSearchOptions: { kind: "vector-ivf", numLists: 100, similarity: "COS", dimensions: 1536 // 需与你的向量维度一致 } } );
2. C# 向量搜索代码实现
通过手动构造$search管道阶段,实现向量相似度查询:
using MongoDB.Bson; using MongoDB.Driver; using System.Threading.Tasks; // 目标查询向量(维度需与索引定义一致) var queryVector = new float[] { 0.1f, 0.2f, 0.3f, ... }; var database = mongoClient.GetDatabase("your-db-name"); var collection = database.GetCollection<TextChunk>("textChunks"); // 构建向量搜索管道 var pipeline = new BsonDocument[] { new BsonDocument("$search", new BsonDocument { { "cosmosSearch", new BsonDocument { { "vector", queryVector }, { "path", "TextVectors" }, // 对应数据模型中的向量字段名 { "k", 10 }, // 返回最相似的前10条结果 { "similarity", "COS" } // 需与索引创建时指定的算法一致(COS/L2) } }, { "returnStoredSource", true } // 返回完整文档内容 }) }; // 执行查询并获取结果 var similarChunks = await collection.Aggregate<TextChunk>(pipeline).ToListAsync();
3. 添加额外过滤条件
如果需要结合其他字段过滤,可以在$search之后追加$match阶段:
var filteredPipeline = pipeline.Concat(new[] { new BsonDocument("$match", new BsonDocument("Id", new BsonDocument("$ne", "exclude-this-id"))) }); var filteredResults = await collection.Aggregate<TextChunk>(filteredPipeline).ToListAsync();
关键说明
- MongoDB.Driver内置的
VectorSearch方法是为MongoDB Atlas的$vectorSearch阶段设计的,与Cosmos DB的实现不兼容,因此必须手动构造$search管道。 - 确保查询向量的维度、相似度算法与创建索引时的配置完全一致,否则会导致查询失败或结果不准确。
- 你的当前环境(.Net 7 + MongoDb.Driver 2.22.0)完全支持这种自定义管道的方式。
内容的提问来源于stack exchange,提问作者Christian F
相关产品推荐
相关产品推荐

