电商平台网站设计公司wordpress获取当前tag名称
2026/6/1 12:50:28 网站建设 项目流程
电商平台网站设计公司,wordpress获取当前tag名称,wordpress主题菜单,重庆企业网站建设一、什么是 Milvus 向量数据库#xff1f; Milvus 是一款开源的向量数据库#xff08;2019年提出#xff09;#xff0c;其唯一目标是存储、索引和管理由深度神经网络和其他机器学习#xff08;ML#xff09;模型生成的大规模嵌入向量。 作为一个专门设计用于处理输入向…一、什么是 Milvus 向量数据库Milvus 是一款开源的向量数据库2019年提出其唯一目标是存储、索引和管理由深度神经网络和其他机器学习ML模型生成的大规模嵌入向量。作为一个专门设计用于处理输入向量查询的数据库它能够处理万亿级别的向量索引。与现有的关系型数据库主要处理遵循预定义模式的结构化数据不同Milvus 从底层设计用于处理从非结构化数据转换而来的嵌入向量。随着互联网的发展和演变非结构化数据变得越来越常见包括电子邮件、论文、物联网传感器数据、Facebook 照片、蛋白质结构等等。为了使计算机能够理解和处理非结构化数据使用嵌入技术将它们转换为向量。Milvus 存储和索引这些向量。Milvus 能够通过计算它们的相似距离来分析两个向量之间的相关性。如果两个嵌入向量非常相似则意味着原始数据源也很相似。二、关键概念一非结构化数据非结构化数据包括图像、视频、音频和自然语言等信息这些信息不遵循预定义的模型或组织方式。这种数据类型占据了世界数据的约 80%可以使用各种人工智能AI和机器学习ML模型将其转换为向量。二嵌入向量嵌入向量是对非结构化数据如电子邮件、物联网传感器数据、Instagram 照片、蛋白质结构等的特征抽象。数学上嵌入向量是一个浮点数或二进制数的数组。现代的嵌入技术被用于将非结构化数据转换为嵌入向量。三向量相似度搜索向量相似度搜索是将向量与数据库进行比较以找到与查询向量最相似的向量的过程。使用近似最近邻搜索算法加速搜索过程。如果两个嵌入向量非常相似那么原始数据源也是相似的。四Collection和Field与传统数据库引擎类似您也可以在Milvus中创建数据库并为某些用户分配权限来管理它们。那么这些用户就有权管理数据库中的集合。一个Milvus集群最多支持 64 个数据库.在关系数据库中表和字段的结构可以与Milvus中的Collection和Field进行对应Milvus关系数据库描述Collection表集合相当于关系数据库中的表用于组织数据Field字段字段Schema相当于表中的列is_primary主键在Field Schema中标记为主键对应该列的主键dtype数据类型字段的数据类型如INT,VARCHAR等max_length最大长度对应VARCHAR类型字段的最大字符数dim-向量字段的维度没有直接对应但可以视为特殊数据处理注意1个collection最多支持4个向量Field1、Filed schemaField schema是字段的逻辑定义。我们在定义集合架构和管理集合之前需要定义的第一件事就是定义Field schema。Milvus集合中仅支持一个主键字段。属性描述备注name要创建的集合中的字段名称String必填dtype字段的数据类型必填description字段描述String选填is_primary是否设置该字段为主键字段Boolean (trueorfalse) 主键字段必填auto_id主键字段必填切换以启用或禁用自动 ID主键分配True或Falsemax_lengthVARCHAR字段必需允许插入的字符串的最大长度。[1, 65,535]dim向量的维数∈[1, 32768]is_partition_key该字段是否是分区键字段布尔值true或false2、Collection schemacollection schema是collection的逻辑定义。我们需要在定义collection schema之前定义field schema。属性描述备注field集合中要创建的字段必填description集合描述String,选填partition_key_field设计用作分区键的字段的名称。String 选填enable_dynamic_field是否启用动态模式Boolean (trueorfalse)三、为什么选择Milvus在处理大规模数据集的向量搜索时具有高性能。开发者优先的社区提供多语言支持和工具链。云扩展性和高可靠性即使出现故障也不会受到影响。通过将标量过滤与向量相似度搜索配对实现混合搜索。四、支持哪些索引和度量索引是数据的组织单位。在搜索或查询插入的实体之前必须声明索引类型和相似度度量。如果您未指定索引类型则 Milvus 将默认使用暴力搜索。一索引类型1、FLAT暴力搜索FLAT适合在小型、百万级数据集上寻求完全准确和精确搜索结果的场景。这是最简单的索引方式进行暴力搜索brute-force可以保证精确度但效率低尤其在数据量大时。适合场景在小型、百万级数据集上寻求完全精确的搜索结果。FLAT意味着不对原始的向量数据进行压缩保持向量的原始精度所以在进行搜索的时候计算是精确的2、IVF_FLAT1介绍IVF_FLAT通过先分类后精确查找的策略极大提高检索效率。是一种基于倒排索引的方法核心是在精度和速度之间取得一个平衡。核心思想分而治之IVF是Inverted File Index的缩写即倒排索引2工作原理第一步聚类使用聚类算法如k-means将数据集中所有的向量进行“分类簇”算法会计算出来指定数量比如1024个的中心点每个中心点代表一个类别称为簇最终每个向量都会被划分到举例它最近那个中心点所代表的簇中第二步创建倒排索引为第一步中得到的每个簇书架建立一个倒排列表这个列表记录着所有属于这个簇的向量的id以及向量本身因为用的是flat所以数据不压缩每个向量会被映射到它所属的簇这样在查询时系统只需关注与查询向量相似的簇而不需要搜索整个高维空间从而显著降低搜索的时间复杂度。第三步查询阶段1确定搜索范围找到可能相关的书架区域当新查询向量到达系统先计算它与所有簇中心点的距离找到距离最近的若干个簇nprobe决定了查询几个最近的书架区域假设总共有1024个区域簇设置nprobe6查找向量最接近的6个簇中心点对应的区域2在范围内进行精确查找系统从创建的倒排索引列表中取出来nprobe个簇中的所有向量然后在这个子集中进行精确的线性搜索暴力比较找出来最相似的K个结果为了优化查询IVF_FLAT使用一个参数nprobe来控制搜索的簇数。nprobe控制搜索时考虑的簇的数量从而平衡查询精度和查询速度增大nprobe可以搜索更多簇返回更多候选向量提高结果的精确度但查询时间也会增加。减少nprobe可以缩小搜索范围降低计算时间查询速度更快但可能会牺牲一些精度3、IVF_SQ81介绍IVF_SQ8是在 IVF_FLAT 基础上增加了量化步骤的一种索引方法其核心思想与 IVF_FLAT 类似IVF_SQ8通过标量量化Scalar Quantization将每个维度的 4 字节浮点数表示压缩为 1 字节整数表示。核心思想压缩2关键技术IVF_SQ8包含两个关键的技术1Inverted File Index继承了IVF_FLAT的聚类搜索框架2Scalar Quantization to 8 bit新增的标量量化技术将数据压缩到原来的1/4量化过程[0.0,0.2]-映射到整数0[0.2,0.4]-映射到整数1[0.4,0.6]-映射到整数2[0.6,0.8]-映射到整数3[0.8,1.0]-映射到整数4映射过程:如0.9落在[0.8,1.0]之间映射为4...压缩效益存储空间变为原来的1/44、IVF_PQ1介绍IVF_PQ是一种高效的向量索引方式结合了倒排文件索引和乘积量化Product Quantization技术旨在加速大规模高维数据集的检索。倒排文件索引IVF_PQ首先将数据集划分为多个簇每个簇由一个聚类中心表示。查询时系统首先计算查询向量与这些聚类中心的距离选择最接近的几个簇进行详细搜索从而减少计算量。乘积量化在每个簇内向量被进一步量化为多个子向量这些子向量通过独立的量化过程进行编码。这样可以显著降低存储需求并加快相似度计算。存储与速度IVF_PQ通过减少存储空间的占用同时保持较高的查询速度和准确性适用于处理大规模高维向量数据。2工作原理介绍第一部分场景与数据定义我们先来定义一个非常具体、简化的问题场景以便后续逐步推演。任务从 12 个 4 维向量中找与查询向量 ( Q ) 最相似的 3 个向量。数据表示每张图片由一个4维向量表示。这显然不现实但低维度能让我们在演示时看清所有计算细节。数据集12 个 4 维向量V1: [1.0, 2.0, 1.5, 3.0]V2: [1.2, 1.8, 1.6, 2.9]V3: [9.0, 8.0, 8.5, 7.0]V4: [9.1, 8.2, 8.4, 7.2]V5: [2.0, 1.0, 3.0, 1.5]V6: [2.1, 1.1, 3.1, 1.4]V7: [8.0, 9.0, 7.0, 8.5]V8: [8.2, 9.1, 7.1, 8.6]V9: [1.5, 2.5, 1.0, 2.5]V10: [9.5, 8.5, 9.0, 7.5]V11: [2.5, 1.5, 2.5, 1.0]V12: [8.5, 9.5, 7.5, 9.0]查询向量( Q: [1.1, 2.1, 1.4, 2.8] )预期与 ( V_1, V_2, V_9 ) 最相似。面临的挑战即使只有12个向量为了找到最近邻暴力搜索需要计算12次距离。如果向量是100万、1000万甚至10亿个呢我们需要IVF_PQ。第二部分倒排文件索引IVF—— 分簇粗筛1. 核心思想回顾分簇建立“书架”。2. 具体步骤演示步骤1聚类我们使用k-means算法将12个向量聚成3个簇 (nlist 3)。经过聚类计算后过程略我们假设得到了3个聚类中心即每个“书架”的标签簇0中心 C0: [1.5, 2.0, 1.5, 2.5] (这个中心可能靠近 V1, V2, V5, V6, V9, V11)簇1中心 C1: [9.0, 8.5, 8.0, 7.5] (这个中心可能靠近 V3, V4, V7, V8, V10, V12)簇2中心 C2: [5.0, 5.0, 5.0, 5.0] (这个中心在中间但可能没有向量离它最近)分配向量计算每个向量到三个中心的距离将其分配到最近的簇。簇0V1, V2, V5, V6, V9, V11簇1V3, V4, V7, V8, V10, V12簇2空步骤2建立倒排索引现在我们有了一个“图书目录”簇0包含V1, V2, V5, V6, V9, V11簇1包含V3, V4, V7, V8, V10, V123. 查询过程IVF阶段接收查询向量 Q: [1.1, 2.1, 1.4, 2.8]粗筛 - 选择候选簇计算Q到C0、C1、C2的距离例如欧氏距离。distance(Q, C0) sqrt((1.1-1.5)^2 (2.1-2.0)^2 (1.4-1.5)^2 (2.8-2.5)^2) ≈ 0.5很小distance(Q, C1) ≈ 很大distance(Q, C2) ≈ 很大我们设定nprobe 1即只搜索距离最近的一个簇。结果我们选择簇0作为候选簇。搜索范围瞬间从12个向量缩小到了6个向量V1, V2, V5, V6, V9, V11。IVF阶段小结我们通过快速的“簇间比较”排除了完全不相关的簇1V3, V4, V7, V8, V10, V12避免了在这6个向量上浪费计算资源。第三部分乘积量化PQ—— 簇内精算这是最需要详细解释的部分。现在我们只在簇0内部对那6个向量进行PQ量化。1. 核心思想回顾分割向量分段量化用编码代替向量。2. 具体步骤演示步骤1分割向量我们的向量是4维。我们将其切分成2段(m 2)每段2维。例如向量 V1 [1.0, 2.0, 1.5, 3.0] 被切分为子向量1: [1.0, 2.0]子向量2: [1.5, 3.0]步骤2为每个子空间创建码本我们为每个子空间独立进行聚类每个子空间聚成2类(k 2)。这意味着每个子码本只有2个码字。针对簇0的所有6个向量进行操作第一个子空间所有向量的前两维:数据点: [1.0,2.0], [1.2,1.8], [2.0,1.0], [2.1,1.1], [1.5,2.5], [2.5,1.5]聚类后得到2个码字中心点:码本1 - 码字0: [1.5, 2.0] (代表[1.0,2.0], [1.2,1.8], [1.5,2.5] 这组的中心)码本1 - 码字1: [2.2, 1.2] (代表[2.0,1.0], [2.1,1.1], [2.5,1.5] 这组的中心)第二个子空间所有向量的后两维:数据点: [1.5,3.0], [1.6,2.9], [3.0,1.5], [3.1,1.4], [1.0,2.5], [2.5,1.0]聚类后得到2个码字:码本2 - 码字0: [1.5, 2.8] (代表[1.5,3.0], [1.6,2.9], [1.0,2.5] 的中心)码本2 - 码字1: [2.8, 1.3] (代表[3.0,1.5], [3.1,1.4], [2.5,1.0] 的中心)步骤3编码向量现在我们用码本为簇0里的每个向量生成一个编码一个由码字索引组成的序列。V1 [1.0, 2.0, 1.5, 3.0]:子向量1 [1.0,2.0] - 离码本1的码字0 [1.5,2.0]更近 -索引0子向量2 [1.5,3.0] - 离码本2的码字0 [1.5,2.8]更近 -索引0V1的PQ编码是 [0, 0]V2 [1.2, 1.8, 1.6, 2.9]:子向量1 [1.2,1.8] - 离码字0 [1.5,2.0]更近 -索引0子向量2 [1.6,2.9] - 离码字0 [1.5,2.8]更近 -索引0V2的PQ编码是 [0, 0](注意V1和V2被编码成了完全相同的形式因为它们本来就很相似)V5 [2.0, 1.0, 3.0, 1.5]:子向量1 [2.0,1.0] - 离码字1 [2.2,1.2]更近 -索引1子向量2 [3.0,1.5] - 离码字1 [2.8,1.3]更近 -索引1V5的PQ编码是 [1, 1]... 以此类推编码完所有向量。存储收益原始一个向量是4个float 16字节。PQ编码后是2个索引每个索引只需1字节因为只有0和1两种可能 2字节。压缩了8倍3. 查询过程PQ阶段- 非对称距离计算这是最精妙的一步。我们现在要查询Q [1.1, 2.1, 1.4, 2.8] 与簇0内6个向量的距离。步骤1预处理查询向量构建距离表同样分割Q: 子向量Q1 [1.1,2.1], 子向量Q2 [1.4,2.8]计算距离表我们预先计算Q的每一段与对应码本中所有码字的距离。子表1 (针对第一段):d(Q1, 码本1-码字0 [1.5,2.0])sqrt((1.1-1.5)^2 (2.1-2.0)^2) ≈ sqrt(0.160.01) ≈ 0.41d(Q1, 码本1-码字1 [2.2,1.2])sqrt((1.1-2.2)^2 (2.1-1.2)^2) ≈ sqrt(1.210.81) ≈ 1.42子表2 (针对第二段):d(Q2, 码本2-码字0 [1.5,2.8])sqrt((1.4-1.5)^2 (2.8-2.8)^2) 0.1d(Q2, 码本2-码字1 [2.8,1.3])sqrt((1.4-2.8)^2 (2.8-1.3)^2) ≈ sqrt(1.962.25) ≈ 2.05现在我们有了一个神奇的距离表段1: [ 0.41, 1.42 ] 段2: [ 0.10, 2.05 ]步骤2查表计算近似距离现在计算Q和V1的距离。V1的PQ编码是 [0, 0]。近似距离 子表1[0] 子表2[0] 0.41 0.10 0.51计算Q和V2的距离。V2的编码也是 [0, 0] - 距离也是0.51计算Q和V5的距离。V5的编码是 [1, 1]。近似距离 子表1[1] 子表2[1] 1.42 2.05 3.47步骤3排序并返回结果我们对簇0内所有6个向量完成上述查表计算后得到距离列表取最小的3个V1/V2: ~0.51V9: (假设其编码也是[0,0]或类似距离也会很小)...最终返回Top3结果V1, V2, V9。PQ阶段小结我们通过预先计算好的距离表和简单的查表加法替代了原始的浮点距离计算。虽然得到的是近似距离但排序结果与真实情况一致而计算速度却快了几个数量级。第四部分结果排序与总结IVF_PQ的整体工作流就像一场高效的搜捕行动IVF确定搜索区域警长根据线报查询向量在地图上划出最可能的几个街区候选簇而不是全城搜捕。PQ快速盘查在目标街区内警察不是拿着一张详细的照片去比对每个人计算原始向量距离而是拿着一个“特征清单”距离表快速核对身高段、发型段等编码特征查表计算迅速锁定嫌疑人最相似向量。关键参数与权衡nlist簇数量越大每个簇越小IVF粗筛越精确但聚类和存储索引开销越大。nprobe搜索的簇数越大精度越高速度越慢。是速度与精度之间最直接的调节旋钮。m分段数越多量化越精细精度越高但距离表越大计算量略有增加。k每段码本大小越大量化误差越小精度越高但存储每个索引所需的字节数越多log2(k) bits。5、HNSWHNSW是数据世界的智能导航系统专门解决高维空间中的海量数据相似性搜索设计的。核心思想分层导航将HNSW想象成一个多层次的地图顶层世界地图只显示大洲和主要的国家节点稀疏用于宏观定位中层国家地图显示主要城市和高速公路节点密集增加底层市区详图显示所有街道和建筑节点最密集用于精确定位在一个图书馆中请找出所有与“人工智能理论”相关书籍怎么实现HNSW类似于一个分层导航系统先在顶层的“总索引图”上快速的定位到一个区域比如定位到“计算机科学”区然后到下一层“人工智能”分区再精确到“AI理论”书架最后在书架上仔细的比较整个过程需要几分钟二相似度度量在 Milvus 中相似度度量用于衡量向量之间的相似性。选择一个好的距离度量方法可以显著提高分类和聚类的性能。根据输入数据的形式选择特定的相似度度量方法可以获得最优的性能。对于浮点嵌入通常使用以下指标欧几里得距离L2内积IP余弦相似度 (COSINE)1、欧式距离定义计算向量在欧几里得空间中的直线距离即两点间的几何距离特点值越小越相似距离越近对向量的绝对大小敏感适用于需要衡量物理距离的场景比如图像特征匹配2、内积定义计算两个向量的点积反应他们的对齐程度特点值越大表示越相似对向量的模长敏感模长大的向量容易获得更高的内积可能需要对向量进行归一化场景推荐系统用户-物品向量匹配语义相似性计算3、余弦相似度定义衡量向量方向的相似性忽略模长的影响特点值范围在【-1,1】1表示完全相同方向-1表示相反方向场景自然语言处理文本相似度人脸识别等五、Milvus数据库操作我们使用 Milvus Lite它是pymilvus中包含的一个 python 库可以嵌入到客户端应用程序中。Milvus 还支持在Docker和Kubernetes上部署适用于生产用例。开始之前请确保本地环境中有 Python 3.8 可用。安装pymilvus其中包含 python 客户端库和 Milvus Litepip install pymilvus一设置向量数据库要创建本地的 Milvus 向量数据库只需实例化一个MilvusClient指定一个存储所有数据的文件名如 milvus_demo.db。# 1 数据库的操作 def operate_db(): # 如果uri为数据库名称路径代表本地操作数据库 client MilvusClient(urimilvus_demo.db) # 如果uri为链接地址代表Milvus属于单机服务需要开启Milvus后台服务操作 # client MilvusClient(urihttp://localhost:19530) # # 创建名称为milvus_demo的数据库 # # databases client.list_databases() # if milvus_demo not in databases: # client.create_database(db_namemilvus_demo) # else: # client.using_database(db_namemilvus_demo) return client二Collections操作在 Milvus 中我们需要一个Collections 来存储向量及其相关元数据。你可以把它想象成传统 SQL 数据库中的表格。创建 Collections 时可以定义 Schema 和索引参数来配置向量规格如维度、索引类型和远距离度量。此外还有一些复杂的概念来优化索引以提高向量搜索性能。# 2 collection集合的操作 def operate_table(): # 定义schema ## 注意在定义集合 Schema 时enable_dynamic_fieldTrue 使得您可以插入未定义的字段。一般动态字段以 JSON 格式存储通常命名为 $meta。在插入数据时所有未定义的字段及其值将被保存为键值对。 ## 在定义集合 Schema 时auto_idTrue 可以对主键自动增长id。 schema client.create_schema(auto_idFalse, enable_dynamic_fieldTrue) # # schema添加字段id, vector schema.add_field(field_nameid, datatypeDataType.INT64, is_primaryTrue) schema.add_field(field_namevector, datatypeDataType.FLOAT_VECTOR, dim5) schema.add_field(field_namescalar1, datatypeDataType.VARCHAR, max_length256, description标量字段) ​ # # 创建集合 client.create_collection(collection_namedemo_v1, schemaschema) # # 设置索引 index_params client.prepare_index_params() # # 在向量字段vector上面添加一个索引 # index_type, # 留空以使用自动索引 # 对于向量字段常见的默认索引类型包括IVF_FLAT或HNSW等具体取决于数据的特性和查询需求。 # 对于标量字段常见的默认索引可能是INVERTED等。 index_params.add_index(field_namevector, metric_typeCOSINE, index_type, index_namevector_index) client.create_index(collection_namedemo_v1, index_paramsindex_params) # # 查看索引信息 res client.list_indexes(collection_namedemo_v1) print(f索引信息--》{res}) ​ res client.describe_index(collection_namedemo_v1, index_namevector_index) print(f指定索引详细信息--{res}) ​ # 查看索引状态 # client.load_collection(collection_namedemo_v1) # print(client.get_load_state(collection_namedemo_v1)) # 如果不需要索引可以删除相关索引 # client.release_collection(collection_namedemo_v1) # client.drop_index(collection_namedemo_v1, index_namevector_index) ​ # 检索标量字段 index_params1 client.prepare_index_params() index_params1.add_index(field_namescalar1, index_type, index_namedefault_index) client.create_index(collection_namedemo_v1, index_paramsindex_params1) # # 查看索引信息 res client.list_indexes(collection_namedemo_v1) print(f索引信息--》{res}) # res client.describe_index(collection_namedemo_v1, index_namevector_index) print(f指定索引详细信息--{res})三Entity实体数据操作在 Milvus 中实体指的是Collections中共享相同Schema的数据记录行中每个字段的数据构成一个实体。因此同一 Collections 中的实体具有相同的属性如字段名称、数据类型和其他约束1、数据的增、删、改def operate_entity(): # # todo:1. 创建集合collection # 这种方式: collection 只包括两个字段. id 作为主键 vector 作为向量字段以及自动设置 auto_id、enable_dynamic_field 为 True # auto_id 启用此设置可确保主键自动递增。在数据插入期间无需手动提供主键。 # enable_dynamic_field 启用后要插入的数据中除 id 和 vector 之外的所有字段都将被视为动态字段。 # # 这些附加字段作为键值对保存在名为 $meta 的特殊字段中。此功能允许在数据插入期间包含额外的字段。 # client.create_collection(collection_namedemo_v2, dimension5, metric_typeIP) # # # todo:2. 插入数据也叫实体 data [ {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: pink_8682}, {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: red_7025}, {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: orange_6781}, {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: pink_9298}, {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: red_4794}, {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: yellow_4222}, {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: red_9392}, {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: grey_8510}, {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: white_9381}, {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: purple_4976} ] res client.insert(collection_namedemo_v2, datadata) # print(res) ​ ## todo:2.1 将数据插入到特定分区可以在插入请求中指定分区名称如下所示 data [ {id: 10, vector: [-0.5570353903748935, -0.8997887893201304, -0.7123782431855732, -0.6298990746450119, 0.6699215060604258], color: red_1202}, {id: 11, vector: [0.6319019033373907, 0.6821488267878275, 0.8552303045704168, 0.36929791364943054, -0.14152860714878068], color: blue_4150}, {id: 12, vector: [0.9483947484855766, -0.32294203351925344, 0.9759290319978025, 0.8262982148666174, -0.8351194181285713], color: orange_4590}, {id: 13, vector: [-0.5449109892498731, 0.043511240563786524, -0.25105249484790804, -0.012030655265886425, -0.0010987671273892108], color: pink_9619}, {id: 14, vector: [0.6603339372951424, -0.10866551787442225, -0.9435597754324891, 0.8230244263466688, -0.7986720938400362], color: orange_4863}, {id: 15, vector: [-0.8825129181091456, -0.9204557711667729, -0.935350065513425, 0.5484069690287079, 0.24448151140671204], color: orange_7984}, {id: 16, vector: [0.6285586391568163, 0.5389064528263487, -0.3163366239905099, 0.22036279378888013, 0.15077052220816167], color: blue_9010}, {id: 17, vector: [-0.20151825016059233, -0.905239387635804, 0.6749305353372479, -0.7324272081377843, -0.33007998971889263], color: blue_4521}, {id: 18, vector: [0.2432286610792349, 0.01785636564206139, -0.651356982731391, -0.35848148851027895, -0.7387383128324057], color: orange_2529}, {id: 19, vector: [0.055512329053363674, 0.7100266349039421, 0.4956956543575197, 0.24541352586717702, 0.4209030729923515], color: red_9437} ] ​ # ## todo:3. 创建分区 client.create_partition(collection_namedemo_v2, partition_namepartitionA) # # # # # todo: 3.1 分区中插入数据 res client.insert(collection_namedemo_v2, datadata, partition_namepartitionA) # print(res) ## todo:4. 更新插入数据 # 在 Milvus 中upsert 操作执行数据级操作根据集合中是否已存在主键来插入或更新实体。具体来说 # 如果集合中已存在该实体的主键则现有实体将被覆盖。 # 如果集合中不存在主键则将插入一个新实体。 data [ {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: black_9898}, {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: red_7319}, {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827],color: white_6465}, {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: orange_7580}, {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: red_3314}, {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: black_9955}, {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: yellow_2461}, {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: white_5015}, {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: purple_6414}, {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: brown_7231} ] ​ res client.upsert(collection_namedemo_v2, datadata) # print(res) # 注意如果分区中不存在更新数据的id就不会受影响但是会影响集合里已经存在的相同id的实体 # res client.upsert(collection_namedemo_v2, datadata, partition_namepartitionA) # todo:5. 删除实体数据 # 按照过滤器删除如果不指定分区默认情况下会在整个集合中进行删除 res client.delete(collection_namedemo_v2, filterid in [12, 5, 6]) print(res) # 按照id进行删除指定分区删除数据 # res client.delete(collection_namedemo_v2, ids[1, 2, 3, 4], partition_namepartitionA) print(res)2、数据的查询1简单查询# entity实体数据的操作查询 def query_operation(): # # todo: 1. 单向量搜索 res client.search(collection_namedemo_v2, data[[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]], limit2, search_params{metric_type: IP}, output_fields[id, vector]) # search_params是在查询时执行距离计算方式如果定义索引的时候已经制定了方式可以不写 print(res) # todo: 2. 批量向量搜索 res client.search(collection_namedemo_v2, data[[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345]], limit2, search_params{metric_type: IP}, output_fields[id, vector]) # search_params是在查询时执行距离计算方式如果定义索引的时候已经制定了方式可以不写 print(res) # todo: 3. 分区搜索 # 要进行分区搜索只需在搜索请求的 partition_names 中包含目标分区的名称即可。这指定search操作仅考虑指定分区内的向量。 res client.search( collection_namedemo_v2, data[[0.02174828545444263, 0.058611125483182924, 0.6168633415965343, -0.7944160935612321, 0.5554828317581426]], limit5, search_params{metric_type: IP, params: {}}, partition_names[partitionA] # 这里指定搜索的分区 ) print(res) # todo: 4.使用输出字段进行搜索 # 使用输出字段进行搜索允许您指定搜索结果中应包含匹配向量的哪些属性或字段。 res client.search( collection_namedemo_v2, data[[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]], limit5, search_params{metric_type: IP, params: {}}, output_fields[vector, color] # 返回定义的字段 ) print(res) # todo: 5.过滤搜索 # 过滤器搜索筛选搜索将标量筛选器应用于矢量搜索允许我们根据特定条件优化搜索结果。 # 例如要根据字符串模式优化搜索结果可以使用 like 运算符。此运算符通过考虑前缀、中缀和后缀来启用字符串匹配 # 筛选颜色以红色为前缀的结果 res client.search( collection_namedemo_v2, data[[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]], limit5, search_params{metric_type: IP, params: {}}, output_fields[color], filtercolor like red% ) print(res) # todo: 6.范围搜索 # 范围搜索允许查找距查询向量指定距离范围内的向量。 # 范围搜索:radius定义搜索空间的外边界。只有距查询向量在此距离内的向量才被视为潜在匹配。 # range_filter虽然radius设置搜索的外部限制但可以选择使用range_filter来定义内部边界创建一个距离范围在该范围内向量必须落下才被视为匹配。 search_params { metric_type: IP, params: { radius: 0.8, # 搜索圆的半径 range_filter: 1 # 范围过滤器用于过滤出不在搜索圆内的向量。 } } ​ res client.search( collection_namedemo_v2, data[[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]], limit3, # 返回的搜索结果最大数量 search_paramssearch_params, output_fields[color], ) # # print(res) result json.dumps(res, indent4) print(result)2复杂查询混合检索要对两组 ANN 搜索结果进行合并和重新排序有必要选择适当的重新排序策略。支持两种重排策略加权排名策略WeightedRanker和重排序策略RRFRanker。在选择重排策略时需要考虑的一个问题是在向量场中是否需要强调一个或多个基本 ANN 搜索。加权排名如果您要求结果强调特定的向量场建议使用该策略。通过 WeightedRanker您可以为某些向量场分配更高的权重从而更加强调这些向量场。例如在多模态搜索中图片的文字描述可能比图片的颜色更重要。使用 WeightedRanker 策略时需要在WeightedRanker函数中输入权重值。混合搜索中的基本 ANN 搜索次数与需要输入的值的次数相对应。输入值的范围应为 [0,1]数值越接近 1 表示重要性越高。from pymilvus import WeightedRanker rerank WeightedRanker(0.8, 0.3)RRFRanker倒数排序融合在没有特定重点的情况下建议采用这种策略。RRF 可以有效平衡每个向量场的重要性。RRFRanker的核心思想是根据每个结果在其检索列表中的排名位置来计算分数。具体而言算法使用以下公式为每个结果分配分数d表示文档。N表示不同检索路径的数量。ranki(d)表示文档d在第i个检索器中的排名位置从0开始计数。k是一个平滑参数用于控制随着排名增加分数的降低速度。默认值通常设置为60。使用 RRFRanker 策略时需要将参数值k输入 RRFRanker。k的默认值为 60。该参数有助于确定如何组合来自不同 ANN 搜索的排名目的是平衡和混合所有搜索的重要性from pymilvus import RRFRanker ​ ranker RRFRanker(100)代码实现def complex_query(): # # 定义schema ​ schema client.create_schema(enable_dynamic_fieldFalse) schema.add_field(field_namefilm_id, datatypeDataType.INT64, is_primaryTrue) schema.add_field(field_namefilmVector, datatypeDataType.FLOAT_VECTOR, dim5) # 向量字段 schema.add_field(field_nameposterVector, datatypeDataType.FLOAT_VECTOR, dim5) # 向量字段 # # # 定义索引 index_params client.prepare_index_params() index_params.add_index(field_namefilmVector, index_typeIVF_FLAT, metric_typeL2, params{nlist: 128}) index_params.add_index(field_nameposterVector, index_type, metric_typeCOSINE) ​ # 创建集合 client.create_collection(collection_namedemo_v3, schemaschema, index_paramsindex_params) ​ # 向量库中插入实体 entities [] for _ in range(1000): # 构造实体 film_id random.randint(1, 10000) film_vector [random.random() for _ in range(5)] poster_vector [random.random() for _ in range(5)] entity {film_id: film_id, filmVector: film_vector, posterVector: poster_vector} entities.append(entity) ​ client.insert(collection_namedemo_v3, dataentities) ​ # 多向量查询注意和批量向量查询不同 # 多向量搜索使用 hybrid_search() API 在一次调用中执行多个 ANN 搜索请求。每个 AnnSearchRequest 代表特定矢量场上的单个搜索请求。 # 示例创建两个 AnnSearchRequest 实例以对两个向量字段执行单独的相似性搜索。 # 创建多搜索请求 filmVector query_filmVector [[0.8896863042430693, 0.370613100114602, 0.23779315077113428, 0.38227915951132996, 0.5997064603128835]] dense_search_params {data: query_filmVector, anns_field: filmVector,# 该参数值必须与集合模式中使用的值相同。 param: {metric_type: L2, nprobe: 10},# nprobe代表访问簇的数量 limit: 2} request_1 AnnSearchRequest(**dense_search_params) ​ # 创建多搜索请求 posterVector query_posterVector [[0.02550758562349764, 0.006085637357292062, 0.5325251250159071, 0.7676432650114147, 0.5521074424751443]] sparse_search_params {data: query_posterVector, anns_field: posterVector, # 该参数值必须与集合模式中使用的值相同。 param: {metric_type: COSINE}, limit: 2 } request_2 AnnSearchRequest(**sparse_search_params) ​ reqs [request_1, request_2] ranker RRFRanker(100) ​ res client.hybrid_search( collection_namedemo_v3, reqsreqs, rankerranker, limit2 ) for hits in res: print(TopK results:) for hit in hits: print(hit)四加载现有数据由于 Milvus Lite 的所有数据都存储在本地文件中因此即使在程序终止后你也可以通过创建一个带有现有文件的MilvusClient将所有数据加载到内存中。例如这将恢复 milvus_demo.db 文件中的 Collections并继续向其中写入数据。from pymilvus import MilvusClient ​ client MilvusClient(milvus_demo.db)五删除Collections如果想删除某个 Collections 中的所有数据可以通过以下方法丢弃该 Collections# Drop collection client.drop_collection(collection_namedemo_collection)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询