Milvus向量数据库是什么?-CSDN博客

一、核心概念解析

1.1 基础概念

1.1.1 Bitset(位集)
  • 高效的数据表示方式,使用位数组替代传统数据类型

  • 默认情况下,位值根据特定条件设置为 0 或 1

1.1.2 通道机制
  • PChannel(物理通道):对应日志存储主题,系统启动时分配256个

  • VChannel(逻辑通道):代表集合中的分片,逻辑独立但物理资源共享

1.1.3 数据组织结构
  • Collection(集合):相当于关系型数据库中的表

  • Partition(分区):集合的物理划分,减少读取负载

  • Segment(段):自动创建的数据文件,分为增长段和封闭段

  • Sharding(分片):基于主键哈希的写入负载分发机制

1.1.4 数据元素
  • Entity(实体):由字段组成的完整数据记录,具备唯一主键

  • Field(字段):支持标量数据(数字、字符串)和向量数据

  • Embedding Vector:非结构化数据的特征抽象表示

1.1.5 系统依赖
  • etcd:元数据存储

  • MinIO/S3:对象存储

  • Pulsar:快照日志管理

1.2 向量索引

1.2.1 索引类型
  • 内存索引:提升查询性能,每个字段支持单一索引类型

  • ANNS索引:近似最近邻搜索,平衡精度与效率

  • 磁盘索引:需特定硬件和环境支持

1.2.2 索引分类
  • 基于树的索引

  • 基于图的索引

  • 基于哈希的索引

  • 基于量化的索引

1.2.3 数据预处理
  • 归一化处理:将向量转换为范数为1,使内积等于余弦相似度

  • 非结构化数据处理:通过AI/ML模型转换为向量表示


二、连接配置

2.1 网络配置

bash

# 默认端口配置
GRPC_PORT=19530    # SDK连接端口
REST_PORT=9091     # HTTP接口端口

2.2 客户端连接

java

// 创建连接实例
public MilvusServiceClient createClient(String host, int port) {return new MilvusServiceClient(ConnectParam.newBuilder().withHost(host).withPort(port).build());
}// 连接使用示例
MilvusServiceClient client = createClient("localhost", 19530);// 资源释放
client.close();

三、集合管理

3.1 集合创建模板

java

public CreateCollectionParam buildCollectionSchema() {// 主键字段FieldType idField = FieldType.newBuilder().withName("book_id").withDataType(DataType.Int64).withPrimaryKey(true).withAutoID(false).build();// 标量字段FieldType scalarField = FieldType.newBuilder().withName("word_count").withDataType(DataType.Int64).build();// 向量字段FieldType vectorField = FieldType.newBuilder().withName("book_intro").withDataType(DataType.FloatVector).withDimension(128)  // 根据实际维度调整.build();return CreateCollectionParam.newBuilder().withCollectionName("book").withDescription("图书向量数据库").withShardsNum(2).addFieldType(idField).addFieldType(scalarField).addFieldType(vectorField).build();
}

3.2 集合操作工具方法

java

// 检查集合存在性
public boolean collectionExists(MilvusServiceClient client, String collectionName) {R<Boolean> response = client.hasCollection(HasCollectionParam.newBuilder().withCollectionName(collectionName).build());return response.getData() == Boolean.TRUE;
}// 获取集合统计信息
public void printCollectionStats(MilvusServiceClient client, String collectionName) {R<GetCollectionStatisticsResponse> response = client.getCollectionStatistics(GetCollectionStatisticsParam.newBuilder().withCollectionName(collectionName).build());GetCollStatResponseWrapper wrapper = new GetCollStatResponseWrapper(response.getData());System.out.println("总记录数: " + wrapper.getRowCount());
}

四、数据操作

4.1 数据生成与插入

java

public List<InsertParam.Field> generateSampleData(int recordCount, int vectorDimension) {Random random = new Random();// 生成主键数据List<Long> ids = new ArrayList<>();for (long i = 0; i < recordCount; i++) {ids.add(i);}// 生成标量数据List<Long> wordCounts = new ArrayList<>();for (int i = 0; i < recordCount; i++) {wordCounts.add(10000L + i);}// 生成向量数据List<List<Float>> vectors = new ArrayList<>();for (int i = 0; i < recordCount; i++) {List<Float> vector = new ArrayList<>();for (int j = 0; j < vectorDimension; j++) {vector.add(random.nextFloat());}vectors.add(vector);}// 构建字段列表List<InsertParam.Field> fields = Arrays.asList(new InsertParam.Field("book_id", DataType.Int64, ids),new InsertParam.Field("word_count", DataType.Int64, wordCounts),new InsertParam.Field("book_intro", DataType.FloatVector, vectors));return fields;
}// 执行数据插入
public void insertData(MilvusServiceClient client, String collectionName, String partitionName, List<InsertParam.Field> fields) {InsertParam insertParam = InsertParam.newBuilder().withCollectionName(collectionName).withPartitionName(partitionName).withFields(fields).build();R<MutationResult> response = client.insert(insertParam);if (response.getStatus() != R.Status.Success.getCode()) {throw new RuntimeException("插入失败: " + response.getMessage());}
}

4.2 索引管理

java

public void createVectorIndex(MilvusServiceClient client, String collectionName, String fieldName, IndexType indexType, MetricType metricType, String extraParams) {CreateIndexParam indexParam = CreateIndexParam.newBuilder().withCollectionName(collectionName).withFieldName(fieldName).withIndexType(indexType).withMetricType(metricType).withExtraParam(extraParams).withSyncMode(false).build();client.createIndex(indexParam);
}

五、查询与搜索

5.1 混合搜索实现

java

public SearchResults hybridSearch(MilvusServiceClient client, String collectionName,List<List<Float>> queryVectors, String vectorFieldName,String filterExpr, int topK, String searchParams) {// 确保集合已加载client.loadCollection(LoadCollectionParam.newBuilder().withCollectionName(collectionName).build());SearchParam searchParam = SearchParam.newBuilder().withCollectionName(collectionName).withMetricType(MetricType.L2).withOutFields(Arrays.asList("book_id", "word_count")).withTopK(topK).withVectors(queryVectors).withVectorFieldName(vectorFieldName).withExpr(filterExpr).withParams(searchParams).build();R<SearchResults> response = client.search(searchParam);return response.getData();
}

5.2 向量查询示例

java

public QueryResults queryByCondition(MilvusServiceClient client, String collectionName,String queryExpr, List<String> outputFields) {QueryParam queryParam = QueryParam.newBuilder().withCollectionName(collectionName).withConsistencyLevel(ConsistencyLevelEnum.STRONG).withExpr(queryExpr).withOutFields(outputFields).withOffset(0L).withLimit(100L).build();R<QueryResults> response = client.query(queryParam);return response.getData();
}

六、最佳实践

6.1 性能优化建议

  1. 索引选择:根据数据规模和查询模式选择合适的索引类型

  2. 内存管理:控制加载数据量不超过查询节点总内存的90%

  3. 分区策略:合理使用分区减少读取负载,分片分散写入负载

6.2 错误处理机制

java

public <T> T executeWithRetry(MilvusOperation<T> operation, int maxRetries) {int attempt = 0;while (attempt < maxRetries) {try {return operation.execute();} catch (Exception e) {attempt++;if (attempt >= maxRetries) {throw new RuntimeException("操作失败,重试次数耗尽", e);}try {Thread.sleep(1000 * attempt); // 指数退避} catch (InterruptedException ie) {Thread.currentThread().interrupt();throw new RuntimeException("操作被中断", ie);}}}throw new RuntimeException("未知错误");
}interface MilvusOperation<T> {T execute();
}

七、完整示例

7.1 基础操作流程

java

public class MilvusOperations {private MilvusServiceClient client;private String collectionName = "book";public void fullWorkflow() {// 1. 创建连接client = createClient("localhost", 19530);// 2. 创建集合CreateCollectionParam schema = buildCollectionSchema();client.createCollection(schema);// 3. 插入数据List<InsertParam.Field> data = generateSampleData(1000, 128);insertData(client, collectionName, "novel", data);// 4. 创建索引createVectorIndex(client, collectionName, "book_intro", IndexType.IVF_FLAT, MetricType.L2, "{\"nlist\":1024}");// 5. 执行搜索List<List<Float>> queryVector = Arrays.asList(generateRandomVector(128));SearchResults results = hybridSearch(client, collectionName, queryVector, "book_intro", "word_count <= 11000", 10, "{\"nprobe\":10}");// 6. 资源清理client.releaseCollection(ReleaseCollectionParam.newBuilder().withCollectionName(collectionName).build());client.close();}
}

八、依赖配置

8.1 Maven 配置

xml

<dependencies><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.2.1</version></dependency><!-- 可选:日志框架 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.7</version></dependency>
</dependencies>

8.2 配置建议

  1. 连接池配置:在生产环境中使用连接池管理Milvus连接

  2. 超时设置:根据网络状况调整操作超时时间

  3. 监控集成:集成监控系统跟踪性能指标和错误率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95271.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95271.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95271.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vcruntime140.dll丢失解决办法

解决办法 安装Microsoft Visual C Redistributable https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?viewmsvc-170

LabVIEW实现跨 VI 簇按钮控制功能

​在 LabVIEW 开发场景中&#xff0c;常需实现不同 VI 间的交互操作。本功能借助 VI Server 技术&#xff0c;突破 VI 边界&#xff0c;实现对目标 VI 中簇内按钮控件的属性读取与控制&#xff0c;为多 VI 协同、对VI里已经实现的功能&#xff0c;可以在其他VI中直接使用&#…

JS箭头函数

JavaScript 的箭头函数 (Arrow Function) 是 ES6 (ECMAScript 2015) 引入的一种重要的函数语法特性&#xff0c;它用更简洁的方式定义函数&#xff0c;并改变了 this 的绑定行为。 箭头函数和传统函数的主要区别&#xff1a;特性箭头函数传统函数语法更简洁&#xff0c;省略 fu…

linux内核 - 文件系统相关的几个概念介绍

介绍文件系统之前&#xff0c;先了解下存储管理的几个概念&#xff1a;1. 硬盘&#xff1a;是最底层的存储介质&#xff0c;比如 /dev/sda, /dev/nvme0n1. 一个物理硬盘就是一个块设备&#xff0c;未经处理是只能顺序读写二进制数据。 2. 分区&#xff1a;就是在硬盘上划分出不…

边缘计算(Edge Computing)+ AI:未来智能世界的核心引擎

边缘计算&#xff08;Edge Computing&#xff09; AI&#xff1a;未来智能世界的核心引擎 文章目录边缘计算&#xff08;Edge Computing&#xff09; AI&#xff1a;未来智能世界的核心引擎摘要什么是边缘计算&#xff1f;为什么需要边缘计算&#xff1f;1. 延迟问题2. 带宽压力…

计算机视觉与深度学习 | ORB-SLAM3算法原理与Matlab复现指南

文章目录 一、算法核心原理 1.1 系统架构概述 1.2 数学模型基础 1.2.1 状态估计框架 1.2.2 视觉-惯导融合模型 1.3 关键创新点 二、关键模块实现细节 2.1 ORB特征提取与匹配 2.2 地图初始化 2.3 视觉-惯导融合 2.4 回环检测与优化 三、Matlab复现思路 3.1 系统模块划分 3.2 核心…

分布式光伏模式怎么选?从 “凭经验” 到 “靠数据”,iSolarBP 帮你锁定最优解

iSolarBP-阳光新能源旗下分布式光伏光储智能评估设计软件 iSolarBP是阳光新能源打造的分布式光伏/光储项目智能设计平台。提供无人机自动勘测、3D建模、高精度发电仿真、光储容量优化与经济分析一站式服务&#xff0c;助力开发者提升效率、降低成本和优化投资收益。https://iso…

MATLAB R2010b系统环境(四)MATLAB帮助系统

一、帮助命令MATLAB帮助命令包括help、lookfor以及模糊查询。1.1 help命令在命令窗口中直接输入help或help加函数名。&#xff08;1&#xff09;help&#xff1a;显示当前帮助系统中所包含的所有项目&#xff0c;即搜索路径中所有的目录名称&#xff0c;如下图&#xff1a;&…

“便农惠农”智慧社区系统(代码+数据库+LW)

摘要 随着城市化进程加速和信息技术快速发展&#xff0c;传统社区管理模式已难以满足现代社区高效管理和居民多元化服务需求。为解决社区管理中的信息孤岛问题、提升服务效率并增强居民生活体验&#xff0c;本文设计并实现了一套基于Spring Boot框架的智慧社区管理系统。该系统…

智慧金融服务平台问题剖析与改进策略

智慧金融服务平台问题剖析与改进策略 在数字化浪潮的推动下&#xff0c;智慧金融服务平台蓬勃发展&#xff0c;为用户带来了便捷的金融服务体验。然而&#xff0c;随着用户数量的不断增加和业务的日益复杂&#xff0c;平台也暴露出一些问题&#xff0c;其中数据准确性不足、异常…

【Vue2✨】Vue2 入门之旅(三):数据与方法

在前两篇文章中&#xff0c;我们学习了 Vue 的基础和模板语法。本篇我们将深入 数据与方法&#xff0c;理解 data、methods、computed、watch 的作用和区别。 目录 datamethodscomputedwatch小结 data Vue 实例中的 data 是数据源&#xff0c;模板会自动响应其中的变化。 &l…

自动化测试时,chrome浏览器启动后闪退的问题

之前运行的好好的&#xff0c;最近再次练习时发现会闪退&#xff0c;然后发现是驱动版本老的问题 &#xff08;1&#xff09;下载与之匹配的驱动器版本 Chrome for Testing availability 找到与Chrome版本前3位相同的目录&#xff0c;下载对应系统的压缩包 &#xff08;2&am…

Dynamics 365 XrmToolBox工具之Clone Field Definitions

好久没有分享XrmToolBox的组件了&#xff0c;今天要分享的是下图中这个组件在建实体的时候&#xff0c;我们经常会碰到实体间一些字段存在重复&#xff0c;或者都可以直接复制黏贴加一些少量修改就可以生成第二个实体&#xff0c;但如果仅从D365本身来说&#xff0c;要做到复制…

UBUNTU之Onvif开源服务器onvif_srvd:1、编译

下载源码 编译时会下载东西&#xff0c;有可能需要VPN。 https://github.com/KoynovStas/onvif_srvd https://github.com/KoynovStas/onvif_srvd/tags 解压准备工作 sudo apt install -y flex bison byacc make cmake m4# for support encryption and WS-Security # 在低版…

深度学习跨领域应用探索:从技术落地到行业变革

深度学习不再是实验室里的 “高精尖技术”&#xff0c;而是渗透到各行各业的 “效率引擎”。它凭借强大的数据拟合与特征提取能力&#xff0c;在计算机视觉、自然语言处理、金融风控等领域打破传统技术瓶颈&#xff0c;甚至催生出全新的业务模式。本文将深入不同行业场景&#…

计算机网络:数据库(sqlite3)

一、常用的数据库ORACLE&#xff08;大型&#xff09;、Mysal&#xff08;开源常用&#xff09;、SQL server、Access、Sybse、Windows NT二、sqlite3&#xff08;一&#xff09;特性&#xff1a;<1>零配置&#xff0c;无需安装和配置<2>储存在单一磁盘文件中的一个…

Web开发:使用Quartz库结合WebAPI根据任务列表定时执行相应逻辑

一、实体及文件结构public class JobSchedule {public string Id { get; set; }public string Title { get; set; }public string Cron { get; set; } }二、服务类后台服务类初始化时会调用此类的StartAsync方法public class QuartzService : IQuartzService {private readonly…

数据结构栈的应用

1.栈的应用 后入先出的有序列表//无法进行小数、负数计算&#xff0c;除法计算为在除法步骤时舍弃小数部分public static void main(String[] args) {//双栈实现计算器功能,思路//1.定义数栈1、符号栈2、扫描指针index&#xff0c;从前往后扫描表达式序列//2.遇到数字&#xff…

npm 打包上传命令,撤销错误版本

添加npm用户账号npm adduser上传包命令npm publish撤销错误版本example&#xff1a;npm unpublish longze-guide0.1.0 --forcepackage.json example{"name": "longze-guide","version": "0.1.1","private": false,"des…

Python爬虫实战:研究Pyplot模块,构建IMDb数据采集和分析系统

1. 引言 1.1 研究背景 在大数据时代,互联网蕴含着海量有价值的信息,如何高效获取并分析这些信息成为各行各业的重要需求。网络爬虫作为一种自动化数据采集工具,能够按照预定规则从网页中提取所需信息,为数据分析提供基础数据支撑。而数据可视化则是将抽象数据转化为直观图…