milvus数据库的数据管理-插入数据

news/2024/7/19 14:05:30 标签: 数据库, milvus, oracle

一、插入数据

1.准备数据

数据必须与数据库中定义的字段元数据一致,与集合的模式匹配

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  # use `default_value` for a field 使用空值占位一个字段
  [], 
  # or
  None,
  # or just omit the field  直接省略一个字段
]
# 对于动态模式,可以灵活地增加字段和值
data.append([str("dy"*i) for i in range(2000)])

2.插入数据
连接现有的集合,可通过指定partition_name来选择将数据插入指定分区。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
mr = collection.insert(data)

Parameter Description
data Data to insert into Milvus.
partition_name (optional) Name of the partition to insert data into.

3.flush调用
当数据被插入到Milvus中时,会被插入到段中。段必须达到一定大小才能被密封和索引。
未密封的段将被暴力搜索。为了避免这种情况,最好调用flush()。flush调用将密封任何剩余段并将它们发送到索引。

二、从文本批量插入实体

1.准备数据文件

①基于行的json文件
文件名自定义,但是根键必须是raw。实体以字典组织,key是字段名,value是字段值
提示:

不要添加不存在于目标集合中的字段,也不要漏掉目标集合模式定义的任何字段。
在每个字段中使用正确类型的值。例如,在整数字段中使用整数,在浮点字段中使用浮点数,在varchar字段中使用字符串,在向量字段中使用浮点数组。
不要在JSON文件中包含自动生成的主键。
对于二进制向量,请使用uint8数组。每个uint8值表示8个维度,值必须介于0和255之间。例如,[1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 1, 1]是一个16维的二进制向量,应该在JSON文件中写成[128, 7]。

{
  "rows":[
    {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]},
    {"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]},
    {"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]},
    {"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]},
    {"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
  ]
}


{
  "rows":[
    {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2], "book_props": {"year": 2015, "price": 23.43}},
    {"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2], "book_props": {"year": 2018, "price": 15.05}},
    {"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2], "book_props": {"year": 2020, "price": 36.68}},
    {"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2] , "book_props": {"year": 2019, "price": 20.14}},
    {"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2] , "book_props": {"year": 2021, "price": 9.36}}
  ]
}

②基于列的numpy文件
可以使用NumPy数组将数据集的每个列组织到单独的文件中。在这种情况下,使用每个列的字段名称来命名NumPy文件。
使用每个列的字段名称来命名NumPy文件。不要添加命名为目标集合中不存在的字段的文件。每个字段应该有一个NumPy文件。
创建NumPy数组时使用正确的值类型。

import numpy
numpy.save('book_id.npy', numpy.array([101, 102, 103, 104, 105]))
numpy.save('word_count.npy', numpy.array([13, 25, 7, 12, 34]))
arr = numpy.array([[1.1, 1.2],
            [2.1, 2.2],
            [3.1, 3.2],
            [4.1, 4.2],
            [5.1, 5.2]])
numpy.save('book_intro.npy', arr)
 

2.插入实体
①上传数据文件
可以使用MinIO或本地硬盘进行存储。
要使用MinIO进行存储,请将数据文件上传到milvus.yml配置文件中定义的存储桶中minio.bucketName;
对于本地存储,请将数据文件复制到本地磁盘的目录中。

②插入实体
对于json文件,传入单个文件的列表,如:

from pymilvus import utility
task_id = utility.do_bulk_insert(
    collection_name="book",
    partition_name="2022",
    files=["test.json"]
)

对于numpy文件,传入多元素列表:

from pymilvus import utility
task_id = utility.do_bulk_insert(
    collection_name="book",
    partition_name="2022",
    files=["book_id.npy", "word_count.npy", "book_intro.npy", "book_props.npy"]
)

每次批量插入API调用都会立即返回。返回值是在后台运行的数据导入任务的ID。

设置文件路径时,请注意
如果您将数据文件上传到MinIO实例,则有效的文件路径应相对于在**“milvus.yml"中定义的根桶,例如"data/book_id.npy”
如果您将数据文件上传到本地硬盘,则有效的文件路径应为绝对路径,例如
"/tmp/data/book_id.npy"**。
如果您有很多文件需要处理,请考虑创建多个数据导入任务并让它们并行运行。

三、检查任务状态

批量插入API是异步的,您可能需要检查数据导入任务是否已完成。
使用get_bulk_insert_state()
1.检查单个任务:

task = utility.get_bulk_insert_state(task_id=task_id)
print("Task state:", task.state_name)
print("Imported files:", task.files)
print("Collection name:", task.collection_name)
print("Partition name:", task.partition_name)
print("Start time:", task.create_time_str)
print("Imported row count:", task.row_count)
print("Entities ID array generated by this task:", task.ids)
 
if task.state == BulkInsertState.ImportFailed:
    print("Failed reason:", task.failed_reason)
 

2.检查所有任务
使用list-bulk-insert-tasks()

tasks = utility.list_bulk_insert_tasks(collection_name="book", limit=10)
for task in tasks:
    print(task)

四、检查数据可搜索性

1.检查索引构建进度
PyMilvus提供了一种实用方法,等待索引构建过程完成。

utility.wait_for_index_building_complete(collection_name)
 

2.将新段加载到查询节点

collection.load(_refresh = True)
 

默认情况下,_refresh参数为false。在首次加载集合时不要将其设置为true。


http://www.niftyadmin.cn/n/5187921.html

相关文章

vue3 tsx 项目中使用 Antv/G2 实现多线折线图

Antv/G2 文档 Antv/G2 双折线图 安装 antV-G2 通过 npm 安装 项目中安装 antv/g2 依赖库&#xff1a; npm install antv/g2 --save安装成功&#xff1a; 浏览器引入 可以将脚本下载到本地&#xff0c;也可以直接引入在线资源。 引入在线资源 <!-- 引入在线资源&…

QT中的控件类概述

QT控件类的概述&#xff1a; QT是一个跨平台的应用程序开发框架&#xff0c;它提供了一系列的控件类&#xff0c;用于创建和管理用户界面。控件类是继承自QObject的类&#xff0c;它们可以接收用户的输入&#xff0c;显示信息&#xff0c;或者提供布局和容器功能。控件类通常有…

2022年12月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 小明想在开始表演之前向大家问好并做自我介绍,应运行下列哪个程序?( ) A: B: C: D: 答案:D 外观积木配合显示时间,才能看清楚内容。 第2题 舞台有两个不同的背景,小猫角色的哪个

Windows2019部署IIS后,浏览文件变成下载的问题解决过程

1、反复重起服务器、重建应用程序、建应用程序并改名才好使&#xff01; 2、总体上&#xff0c;角色为&#xff1a; 一、在Windows2019服务器上&#xff0c;填加角色&#xff0c;一路下一步&#xff0c;到填加服务器角色时&#xff0c;勾选了【Web服务器(IIS)】 二、然后在【…

Excel Unix时间戳和日期时间格式的相互转换

时间戳转日期时间 ((A18*3600)/86400)DATE(1970,1,1) # 或 (A18*3600)/8640070*36519# 带格式化 TEXT((C18*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss")首先加8小时进行时区转换&#xff0c;然后转换成天数&#xff0c;再加上1970年1月1日&#xff0c;最后设置日期…

js鼠标事件详解

以下是一些常见的鼠标事件和相应的JavaScript代码示例&#xff1a; click事件&#xff1a;当鼠标点击元素时触发。 document.getElementById("myButton").addEventListener("click", function() {console.log("Button clicked!"); });mouseove…

SoftwareTest8 - 怎样测试一个系统的性能 ?

Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足以让你成为软件测试行业的佼佼者 , 但是可以让你了解一下软件测试行业的相关知识 , 具有一定的竞争实力 . 这篇文章是带着大家先了解一些性能测试的概…

Linux 安装多版本 JDK 详细过程

背景说明 服务器已安装jdk1.8,但随着spring全家桶的升级换代&#xff0c;已不满足使用&#xff0c;先要用高版本jdk&#xff0c;暂时不想卸载旧的版本&#xff0c;故安装两个版本&#xff0c;jdk1.8和jdk17,jdk1.8的已经安装过了&#xff0c;所以此次只安装jdk17,以及配置jdk切…