目录
- 前置知识
-
- [1. 环境准备](#1. 环境准备)
- [2. Python 连接代码](#2. Python 连接代码)
- 一:表结构操作(建表/改表/删表)
-
- [1. 新建表(创建集合)](#1. 新建表(创建集合))
- [2. 修改表(添加字段)](#2. 修改表(添加字段))
- [3. 删除表(删除集合)](#3. 删除表(删除集合))
- 二:数据增删改操作
-
- [1. 新增数据(插入)](#1. 新增数据(插入))
- [2. 修改数据(更新)](#2. 修改数据(更新))
- [3. 删除数据](#3. 删除数据)
- 三:数据查询(核心!向量查询)
-
- [1. 基础向量查询(找最相似的数据)](#1. 基础向量查询(找最相似的数据))
- [2. 高级查询:向量 + WHERE 条件(混合搜索)](#2. 高级查询:向量 + WHERE 条件(混合搜索))
- 四:索引优化(加速查询)
- 终极总结
前置知识
MySQL 表 → Milvus 集合(Collection)
操作方式:Python 代码(开发用) + SQL 语句(手工/工具用)
SQL 执行工具:Attu(Milvus 官方可视化工具,类似 Navicat)
| MySQL 的概念 | Milvus 对应概念 | 解释 |
|---|---|---|
| 数据库服务(localhost:3306) | Milvus 服务(localhost:19530) | 都是数据库连接地址 |
| 表(table) | 集合(Collection) | 存数据的容器,就是一张表 |
| 列 / 字段(id/title/content) | 字段(Field) | 表里的列,完全一样 |
| 行数据 | 实体(Entity) | 一行数据 |
| 普通数字 / 文本字段 | 标量字段 | 存标题、内容、分类 |
| 无(MySQL 不支持) | 向量字段 | 唯一新东西:存 AI 生成的数字数组 |
| WHERE 条件过滤 | 过滤表达式 | 筛选数据,用法一样 |
| ORDER BY 排序 | 相似度排序 | 按向量相似程度排序 |
| LIMIT 分页 | LIMIT 取前 N 条 | 拿最相似的几条数据 |
1. 环境准备
bash
# 启动Milvus
docker run -d --name milvus -p 19530:19530 milvusdb/milvus:latest
# 安装Python依赖
pip install pymilvus
2. Python 连接代码
python
from pymilvus import MilvusClient, DataType
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
一:表结构操作(建表/改表/删表)
1. 新建表(创建集合)
Python 代码
python
# 创建文章表 article
client.create_collection(
collection_name="article",
schema=[
{"name": "id", "dtype": DataType.INT64, "is_primary": True},
{"name": "title", "dtype": DataType.VARCHAR, "max_length": 255},
{"name": "content", "dtype": DataType.VARCHAR, "max_length": 1000},
{"name": "content_vector", "dtype": DataType.FLOAT_VECTOR, "dim": 1536}
]
)
SQL 写法(和MySQL几乎一样)
sql
-- Milvus SQL 建表
CREATE COLLECTION article (
id INT PRIMARY KEY,
title VARCHAR(255),
content VARCHAR(1000),
content_vector FLOAT_VECTOR DIM=1536
);
2. 修改表(添加字段)
Python 代码
python
# 给表添加一个分类字段 category
client.add_field(
collection_name="article",
field={"name": "category", "dtype": DataType.VARCHAR, "max_length": 50}
)
SQL 写法
sql
-- MySQL: ALTER TABLE ADD COLUMN
-- Milvus: ALTER COLLECTION ADD FIELD
ALTER COLLECTION article ADD FIELD category VARCHAR(50);
3. 删除表(删除集合)
Python 代码
python
# 删除整张表
client.drop_collection(collection_name="article")
SQL 写法
sql
-- 和 MySQL DROP TABLE 完全一致
DROP COLLECTION article;
二:数据增删改操作
1. 新增数据(插入)
注意:向量(content_vector字段)是 AI 生成的,这里先用模拟向量测试
Python 代码
python
data = [
{
"id": 1,
"title": "猫咪介绍",
"content": "猫会抓老鼠",
"content_vector": [0.1]*1536,
"category": "宠物"
}
]
client.insert(collection_name="article", data=data)
SQL 写法(和MySQL 100%相同)
sql
INSERT INTO article (id, title, content, content_vector, category)
VALUES (1, '猫咪介绍', '猫会抓老鼠', '[0.1]*1536', '宠物');
2. 修改数据(更新)
Python 代码
python
# 根据id修改标题
client.update(
collection_name="article",
data={"title": "小猫介绍"},
ids=[1]
)
SQL 写法(和MySQL 100%相同)
sql
UPDATE article SET title = '小猫介绍' WHERE id = 1;
3. 删除数据
Python 代码
python
# 根据id删除数据
client.delete(collection_name="article", ids=[1])
SQL 写法(和MySQL 100%相同)
sql
DELETE FROM article WHERE id = 1;
三:数据查询(核心!向量查询)
1. 基础向量查询(找最相似的数据)
Python 代码
场景:
用户问:什么小动物会抓老鼠?
- 把这句话转成向量(AI 生成)
- 在表里找向量最相似的数据(语义搜索,MySQL 做不到)
- 代码
python
# 4. 向量搜索:对标 MySQL SELECT * FROM article ORDER BY 相似度 LIMIT 3
# 第一步:用户问题 → 生成查询向量(AI生成,这里用测试向量)
query_vector = [0.11, 0.22, 0.33, ...]
# 第二步:执行搜索(核心代码!)
res = client.search(
collection_name="article", # 表名
data=[query_vector], # 查询向量
limit=3, # 取前3条(对标 LIMIT 3)
output_fields=["id", "title", "content"], # 要查的字段
anns_field="content_vector" # 用哪个向量字段搜索
)
# 打印结果
print(res)
结果你会得到:
猫咪介绍 排在第一个!因为语义最匹配!
SQL 写法
sql
SELECT id, title, content, distance
FROM article
ORDER BY ANN(content_vector, '[0.11, 0.22, 0.33, ...]')
LIMIT 3;
2. 高级查询:向量 + WHERE 条件(混合搜索)
Python 代码
python
# 先过滤分类=宠物,再向量搜索
res = client.search(
collection_name="article",
data=[query_vec],
anns_field="content_vector",
output_fields=["id", "title", "content"],
filter="category == '宠物'",
limit=3
)
SQL 写法(和MySQL WHERE 完全一致)
sql
SELECT id, title, content, distance
FROM article
WHERE category = '宠物' -- 你的MySQL技能直接用
ORDER BY ANN(content_vector, '[0.1]*1536')
LIMIT 3;
四:索引优化(加速查询)
Python 代码
python
client.create_index(
collection_name="article",
field_name="content_vector"
)
SQL 写法
sql
CREATE INDEX idx_content_vector ON article(content_vector);
终极总结
- Milvus 有完整 SQL!也可以使用 Python操作
- Milvus SQL 语法和 MySQL 95% 通用 ,仅建表用
CREATE COLLECTION - 唯一新功能:
ORDER BY ANN(向量字段, 查询向量)做语义搜索