using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Milvus.Client; namespace MilvusDemo { /// /// 提供与Milvus向量数据库交互的服务类 /// public class MilvusService { private readonly MilvusClient _milvusClient; private readonly string _collectionName; private readonly int _dim; /// /// 初始化MilvusService的新实例 /// /// Milvus服务器主机名 /// Milvus服务器端口 /// 集合名称 /// 向量维度 public MilvusService(string host, int port, string collectionName, int dim) { _milvusClient = new MilvusClient(host, port); _collectionName = collectionName; _dim = dim; } /// /// 初始化集合,如果存在则删除并重新创建 /// public async Task InitializeCollectionAsync() { // 检查集合是否存在,如果存在则删除 if (await _milvusClient.HasCollectionAsync(_collectionName)) { var collectionToDrop = _milvusClient.GetCollection(_collectionName); await collectionToDrop.DropAsync(); Console.WriteLine($"Collection '{_collectionName}' dropped."); } // 创建新的集合 await _milvusClient.CreateCollectionAsync( _collectionName, new[] { FieldSchema.Create("id", isPrimaryKey: true), FieldSchema.CreateVarchar("varchar", 256), FieldSchema.CreateFloatVector("vector", _dim) }); Console.WriteLine($"Collection '{_collectionName}' created."); } /// /// 创建索引并加载集合 /// public async Task CreateIndexAndLoadAsync() { var collection = _milvusClient.GetCollection(_collectionName); // 创建索引 await collection.CreateIndexAsync("vector", IndexType.Flat, SimilarityMetricType.L2); Console.WriteLine("Index created."); // 加载集合 await collection.LoadAsync(); Console.WriteLine("Collection loaded."); } /// /// 插入随机向量数据 /// /// 要插入的向量数量 public async Task InsertRandomDataAsync(int count) { var collection = _milvusClient.GetCollection(_collectionName); var random = new Random(); // 生成随机向量 var vectors = new List>(); for (int i = 0; i < count; i++) { var vector = new float[_dim]; for (int j = 0; j < _dim; j++) { vector[j] = (float)random.NextDouble(); } vectors.Add(vector); } // 生成ID和字符串字段 var ids = Enumerable.Range(0, count).Select(i => (long)i).ToList(); var varchars = ids.Select(i => $"varchar_{i}").ToList(); // 打包数据 var insertData = new List { FieldData.Create("id", ids), FieldData.Create("varchar", varchars), FieldData.CreateFloatVector("vector", vectors) }; // 执行插入 await collection.InsertAsync(insertData); Console.WriteLine("Data inserted."); } /// /// 执行向量相似度搜索 /// /// 返回最相似的结果数量 /// 搜索结果 public async Task SearchVectorAsync(int topK = 5) { var collection = _milvusClient.GetCollection(_collectionName); var random = new Random(); // 生成随机目标向量 var targetVector = new float[_dim]; for (int j = 0; j < _dim; j++) { targetVector[j] = (float)random.NextDouble(); } // 设置搜索参数 var searchParameters = new SearchParameters(); searchParameters.OutputFields.Add("id"); searchParameters.OutputFields.Add("varchar"); // 执行搜索 var searchResults = await collection.SearchAsync( "vector", new[] { (ReadOnlyMemory)targetVector }, SimilarityMetricType.L2, topK, searchParameters); return searchResults; } } }