Milvus创建默认设置
本节指南梳理 milvus 创建默认设置,遇到一个数据添加的坑
创建默认设置
import sys
from basecofig.milvus import Milvus
# 创建数据库
milvus = Milvus().get_milvus()
# 检查数据库是否存在
if "my_database_text" not in milvus.list_databases():
# 帮我们自动处理一些设置
milvus.create_database(db_name="my_database_text")
print("数据库 'my_database_text' 创建成功")
# 选择使用的数据库
milvus.use_database(db_name="my_database_text")
# 检查集合是否存在
if "text_1" not in milvus.list_collections():
milvus.create_collection(
collection_name="text_1",
dimension=1024 # 1024 维度是 bge-m3 模型的输出维度
)
# 准备数据
data = [
{"id": 0, "vector": [-0.060884606, 0.010383721, 0.005179964, ...], "color": "red_7025_qwe"},
{"id": 1, "vector": [-0.060884606, 0.010383721, 0.005179964, ...], "color": "red_7025_qwe"},
{"id": 2, "vector": [-0.060884606, 0.010383721, 0.005179964, ...], "color": "red_7025_qwe"},
{"id": 3, "vector": [-0.060884606, 0.010383721, 0.005179964, ...], "color": "red_7025_qwe"},
{"id": 4, "vector": [-0.060884606, 0.010383721, 0.005179964, ...], "color": "red_7025_qwe"},
{"id": 5, "vector": [-0.060884606, 0.010383721, 0.005179964, ...], "color": "red_7025_qwe"}
]
# 插入数据
res = milvus.insert(
collection_name="text_1",
data=data
)数据插入说明
默认配置
res = client.describe_collection(
collection_name="quick_setup"
)
默认的配置
{
"collection_name": "text_1",
"auto_id": False, 👈 主键不自动递增
"fields": [
{
"name": "id",
"is_primary": True, 👈 id 是主键
"type": <DataType.INT64: 5>
},
{
"name": "vector",
"params": {"dim": 1024}
}
],
"enable_dynamic_field": true 👈 允许插入额外字段(比如 text、url 等)
}插入数据
id是由自己写入数据指定的,不指定会报错(id)
auto_id=False(默认)表示主键不会自动递增。
在添加数据遇到的问题
- 在添加数据,重复添加多个id=0的数据,被覆盖,而且还存在? milvus版本是2.6
例如:
data: ["{'id': 0, 'vector': [-0.06088460609316826, ...], 'color': 111}"], extra_info: {}
data: ["{'id': 0, 'vector': [-0.06088460609316826,..], 'color': 'pink_8682_qwe'}"], extra_info: {}
# id相同,但是颜色的(属性不同),数据库只显示新添加id=0的数据,之前的数据不会显示(但是可以查询到)
# id相同,属性相同(值不同),数据库只显示新添加的数据id= 0,之前的数据不会显示(但是可以查询到)问题的解释
1. 主键唯一性:
在 Milvus 中,id 字段被定义为主键,必须唯一。以下是关键的配置:
- 主键唯一性:每条记录必须有唯一的
id,这保证了每条数据的唯一性。 auto_id=False:当设置auto_id=False时,你需要手动为每条数据分配id,如果你插入相同id的数据,后插入的数据会覆盖之前的数据。
2. 数据覆盖行为:
当插入具有相同 id 的数据时,Milvus 会发生以下行为:
- 后插入数据覆盖之前的数据:当插入具有相同
id的数据时,Milvus 会将新数据插入并覆盖旧数据。这意味着:- 查询时,你只会看到最新插入的数据。
- 旧数据不可见:虽然旧数据没有完全删除,但它将不会出现在查询结果中。
- 不可查询的旧数据:被覆盖的数据不会完全消失,它们仍然存储在数据库中,但由于唯一主键的限制,查询时不会返回这些数据。
3. 通过过滤查询访问被覆盖数据:
尽管被覆盖的数据在标准查询中不可见,但你仍然可以使用 过滤查询 来访问这些数据。过滤查询允许你根据字段的特定值来查询数据。
- 通过过滤条件,你可以查询到被覆盖的旧数据。例如,可以根据
color字段过滤查询。 - 过滤查询不会受数据是否被覆盖的影响,只要满足过滤条件,数据依然可查询到。
4. 动态字段:
Milvus 支持动态字段,可以为每条记录添加附加字段,如 color、text 等。动态字段不会影响主键或向量索引,并且可以通过过滤查询访问。
- 动态字段只会影响存储的额外信息,而不会影响主键或向量的数据。
5. 数据存储与覆盖机制:
Milvus 使用 逻辑删除(logical delete) 机制:
- 被覆盖的数据不会从数据库中完全删除,而是被标记为不可查询。
- 新插入的数据会替代原有数据,成为唯一可查询的数据。
6. 如何避免数据丢失?
为了避免数据丢失,可以:
- 使用唯一的
id:为每条数据分配唯一的id,例如使用时间戳或 UUID,确保每次插入的数据都是唯一的,不会被覆盖。 - 定期备份数据:为了防止意外数据丢失,建议定期备份数据。
总结:
- 主键唯一性:确保
id的唯一性是保证数据一致性的关键。- 数据覆盖:相同
id的数据会被后插入的数据覆盖,旧数据不可见,但仍然存储在数据库中。- 过滤查询:通过过滤条件,你可以查询被覆盖的数据,访问历史记录。
- 动态字段:动态字段不会影响主键或向量索引,并且可以用作查询条件。
- 数据备份和历史记录:建议定期备份数据或记录历史数据的版本,避免数据丢失。
版权所有
版权归属:念宇
