You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:07:39