Milvus 是一个开源、高性能、可扩展的向量数据库,专门用于存储和检索高维向量数据。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP)、推荐系统、异常检测等 AI 应用场景。
官网:https://milvus.io/
Milvus 采用 分布式架构,主要组件包括:
组件 | 作用 |
---|---|
Proxy | 处理客户端请求,分发查询 |
QueryNode | 负责向量搜索 |
IndexNode | 负责构建索引 |
DataNode | 负责存储和管理数据 |
MetaStore | 存储元数据 |
Coordinator(协调器) | 负责管理集群 |
Milvus 可以使用 Docker 进行安装:
# 安装 Docker
sudo apt update
sudo apt install -y docker.io
# 安装 Docker Compose
sudo apt install -y docker-compose
git clone https://github.com/milvus-io/milvus.git
cd milvus
docker-compose up -d
在 Windows 上安装 Milvus 主要有两种方式:
git clone https://github.com/milvus-io/milvus.git cd milvus
docker-compose up -d
19530
可用于 API 访问。wsl --install
wsl --set-default-version 2
wsl --install -d Ubuntu
sudo apt update // 更新软件包列表
sudo apt install -y docker.io // 安装 Docker
sudo apt install docker-compose -y // 安装 docker-compose
cd ~ // 尝试在 WSL 内部的 Linux 文件系统(如 ~/)中克隆
git clone https://github.com/milvus-io/milvus.git
cd milvus
docker-compose up -d
docker run -d --name attu -p 3000:3000 zilliz/attu
http://localhost:3000
配置项 | 默认值 |
---|---|
接口 | 19530 |
用户名 | 无默认用户名 |
密码 | 无默认密码 |
注意:默认情况下,Milvus 没有身份验证。若需安全访问,可以通过代理层或内部网权限控制实现认证。
pip install pymilvus
from pymilvus import connections
connections.connect(host="localhost", port="19530")
from pymilvus import Collection, CollectionSchema, FieldSchema, DataType
# 定义 Collection 结构
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, description="Example Collection")
# 创建 Collection
collection = Collection(name="example_collection", schema=schema)
import numpy as np
# 生成 1000 个 128 维的随机向量
num_vectors = 1000
dim = 128
vectors = np.random.rand(num_vectors, dim).tolist()
ids = list(range(num_vectors))
# 插入数据
collection.insert([ids, vectors])
index_params = {
"metric_type": "L2", # 余弦相似度/欧式距离
"index_type": "IVF_FLAT",
"params": {"nlist": 128}
}
collection.create_index(field_name="vector", index_params=index_params)
# 生成查询向量
query_vector = np.random.rand(1, 128).tolist()
# 进行相似性搜索
collection.load()
result = collection.search(query_vector, "vector", param={"nprobe": 10}, limit=5)
# 打印结果
for hits in result:
for hit in hits:
print(f"ID: {hit.id}, Distance: {hit.distance}")
在 pom.xml
添加:
io.milvus
milvus-sdk-java
2.3.2
import io.milvus.client.*;
import io.milvus.param.ConnectParam;
public class MilvusExample {
public static void main(String[] args) {
MilvusServiceClient client = new MilvusServiceClient(
ConnectParam.newBuilder()
.withHost("localhost")
.withPort(19530)
.build()
);
System.out.println("Connected to Milvus");
}
}
import io.milvus.param.collection.*;
import io.milvus.grpc.DataType;
import java.util.Arrays;
public class CreateCollection {
public static void main(String[] args) {
MilvusServiceClient client = new MilvusServiceClient(
ConnectParam.newBuilder().withHost("localhost").withPort(19530).build()
);
FieldType idField = FieldType.newBuilder()
.withName("id").withDataType(DataType.Int64)
.withPrimaryKey(true).build();
FieldType vectorField = FieldType.newBuilder()
.withName("vector").withDataType(DataType.FloatVector)
.withDimension(128).build();
CollectionMapping collectionMapping = CollectionMapping.newBuilder()
.withCollectionName("example_collection")
.withDescription("Test collection")
.withFieldTypes(Arrays.asList(idField, vectorField))
.build();
client.createCollection(collectionMapping);
System.out.println("Collection Created");
}
}
import io.milvus.param.dml.InsertParam;
import java.util.*;
public class InsertData {
public static void main(String[] args) {
MilvusServiceClient client = new MilvusServiceClient(
ConnectParam.newBuilder().withHost("localhost").withPort(19530).build()
);
List ids = Arrays.asList(1L, 2L, 3L);
List> vectors = new ArrayList<>();
vectors.add(Arrays.asList(0.1f, 0.2f, 0.3f, ... 128个值));
vectors.add(Arrays.asList(0.4f, 0.5f, 0.6f, ... 128个值));
InsertParam insertParam = InsertParam.newBuilder()
.withCollectionName("example_collection")
.withFields(Arrays.asList(ids, vectors))
.build();
client.insert(insertParam);
System.out.println("Data Inserted");
}
}
import io.milvus.param.dml.SearchParam;
import io.milvus.param.MetricType;
public class SearchVector {
public static void main(String[] args) {
MilvusServiceClient client = new MilvusServiceClient(
ConnectParam.newBuilder().withHost("localhost").withPort(19530).build()
);
List> queryVectors = new ArrayList<>();
queryVectors.add(Arrays.asList(0.1f, 0.2f, 0.3f, ... 128个值));
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName("example_collection")
.withTopK(5)
.withMetricType(MetricType.L2)
.withVectors(queryVectors)
.build();
System.out.println(client.search(searchParam));
}
}
SaaS 系统中,每个租户(Tenant)应有独立的数据管理方案:
tenant1_vectors
、tenant2_vectors
tenant_id
字段:{ "id": 123, "tenant_id": "tenant_A", "vector": [0.1, 0.2, ...] }
SearchParam searchParam = SearchParam.newBuilder() .withCollectionName("example_collection") .withFilter("tenant_id = 'tenant_A'") .build();
数据库 | 主要特点 | 适用场景 |
---|---|---|
Milvus | 分布式、云原生、多索引支持 | NLP、推荐系统、大规模向量数据 |
FAISS | 高效 GPU 加速,适用于离线任务 | 超大规模数据离线处理 |
Pinecone | 云托管,易用性强 | SaaS 应用、无需自己部署 |
Weaviate | 结合语义搜索,支持 JSON 存储 | 文本搜索、知识库 |
HNSWlib | 高速图索引,适合小型应用 | 小规模向量检索 |
如果你需要处理数千万甚至上亿的向量数据,Milvus 是一个非常好的选择!