大家好,我是 @search_engineer,今天分享向量数据库 Milvus 的入门实践经验。
什么是向量检索?
随着 AI 大模型的兴起,向量检索成为搜索领域的新热点。不同于传统的关键词匹配,向量检索通过计算语义相似度来找到相关内容。
应用场景:
- 图片搜索(以图搜图)
- 语义文本搜索
- 推荐系统
- 问答系统
Milvus 简介
Milvus 是一款开源的向量数据库,专为海量向量数据的存储和检索设计。
核心特性:
- 支持十亿级向量数据
- 多种索引类型(IVF、HNSW、ANNOY 等)
- 分布式架构
- 丰富的 SDK(Python、Java、Go 等)
快速入门
安装 Milvus
使用 Docker Compose 一键启动:
version: '3.5'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.5
minio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
milvus:
image: milvusdb/milvus:v2.3.3
ports:
- "19530:19530"
Python 示例代码
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
# 连接 Milvus
connections.connect("default", host="localhost", port="19530")
# 定义集合结构
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, "示例集合")
collection = Collection("example", schema)
# 插入数据
import numpy as np
data = [
[i for i in range(1000)], # id
np.random.random((1000, 128)).tolist() # vectors
]
collection.insert(data)
# 创建索引
collection.create_index("embedding", {"index_type": "IVF_FLAT", "metric_type": "L2"})
# 搜索
results = collection.search(
data=[np.random.random(128).tolist()],
anns_field="embedding",
param={"metric_type": "L2", "params": {"nprobe": 10}},
limit=10
)
索引类型选择
| 索引类型 | 适用场景 | 查询速度 | 内存占用 |
|---|---|---|---|
| FLAT | 小规模数据(<10万) | 慢 | 低 |
| IVF_FLAT | 中等规模 | 中等 | 中等 |
| IVF_SQ8 | 大规模,内存受限 | 快 | 低 |
| HNSW | 高查询性能要求 | 很快 | 高 |
性能优化建议
- 选择合适的索引类型 - 根据数据规模和查询性能要求
- 合理设置 nprobe - 平衡查询速度和召回率
- 数据分批插入 - 避免单次插入过多数据
- 定期 compact - 清理已删除数据,优化存储
与 Elasticsearch 的对比
| 特性 | Milvus | Elasticsearch |
|---|---|---|
| 数据类型 | 向量 | 文本、数值 |
| 检索方式 | 相似度搜索 | 关键词匹配 |
| 适用场景 | 语义搜索、推荐 | 日志、文档搜索 |
| 是否可以结合 | ✅ 可以 | ✅ 可以 |
实际项目中,可以将两者结合:ES 做关键词过滤,Milvus 做语义召回。
参考资源
讨论
你在项目中使用过向量数据库吗?遇到了哪些挑战?欢迎在评论区交流!
本文由 @search_engineer 原创发布,转载请注明出处。
[尊重社区原创,转载请保留或注明出处]
本文地址:http://elasticsearch.cn/article/15674
本文地址:http://elasticsearch.cn/article/15674
9 个评论
大佬好!想问一下 Milvus 和 Elasticsearch 的向量搜索功能有什么区别?我应该选哪个?
@curious_cat 简单对比:Milvus 专注向量搜索,十亿级数据,适合以图搜图、语义搜索;ES 向量功能是附加功能,适合文本为主、向量为辅的场景。如果主要是向量搜索,选 Milvus;如果已有 ES 集群,先用 ES 向量功能试试。
Milvus的向量检索性能如何?能支撑多大的数据量?
前端如何集成向量搜索功能?
向量搜索和传统搜索怎么结合使用?
Milvus的版本兼容性如何?
技术选型时Milvus和Pinecone怎么选?
2024年向量搜索有什么新趋势?
@wang_wu Milvus可以支撑十亿级向量数据,查询延迟在毫秒级。如果数据量在千万以下,ES的向量功能也够用。