【开源向量数据库】Milvus简介

Milvus 是一个开源、高性能、可扩展 的向量数据库,专门用于存储和检索高维向量数据。它支持近似最近邻搜索(ANN) ,适用于图像检索、自然语言处理(NLP)、推荐系统、异常检测等 AI 应用场景。

官网:https://milvus.io/


1. Milvus 的特点

(1)高性能

  • 支持数十亿级向量数据,查询速度快。
  • 使用 近似最近邻(ANN)索引算法,如 HNSW、IVF-FLAT、IVF-PQ、SCANN 等。

(2)分布式架构

  • 可以横向扩展(scalability),适用于大规模数据集。
  • 支持云端部署,可结合 Kubernetes 进行管理。

(3)多种索引支持

  • HNSW(Hierarchical Navigable Small World):高效、高准确度的图索引。
  • IVF-FLAT(Inverted File Index + Flat Search):适用于大规模数据检索。
  • IVF-PQ(Inverted File Index + Product Quantization):节省存储,提高检索效率。

(4)多种数据类型

  • 支持不同类型的向量(浮点数、二进制) ,同时可存储元数据(metadata),比如文本、标签等。
  • 支持 JSON 存储,可以存放结构化数据。

(5)多种 API 语言支持

  • Python
  • Go
  • Java
  • C++

(6)与 AI 生态兼容

  • 可与 PyTorch、TensorFlow、OpenAI Embeddings、Hugging Face 集成,用于 NLP、计算机视觉等任务。
  • 支持 Kubernetes 部署,适合云原生应用。

2. Milvus 架构

Milvus 采用 分布式架构,主要组件包括:

组件 作用
Proxy 处理客户端请求,分发查询
QueryNode 负责向量搜索
IndexNode 负责构建索引
DataNode 负责存储和管理数据
MetaStore 存储元数据
Coordinator(协调器) 负责管理集群

3. 安装 Milvus

Milvus 可以使用 Docker 进行安装:

(1)Linux下的安装方法

1)安装 Docker & Docker Compose
bash 复制代码
# 安装 Docker
sudo apt update
sudo apt install -y docker.io

# 安装 Docker Compose
sudo apt install -y docker-compose
2)拉取 Milvus
bash 复制代码
git clone https://github.com/milvus-io/milvus.git
cd milvus
3)启动 Milvus
bash 复制代码
docker-compose up -d

(2)Windows 下的安装方法

在 Windows 上安装 Milvus 主要有两种方式:

  1. 使用 Docker 安装(推荐)
  2. 使用 WSL(Windows Subsystem for Linux)安装
方法 1:使用 Docker 安装 Milvus(推荐)
1.1 安装 Docker
  • 下载并安装 Docker Desktop for Windows
  • 启用 WSL 2 后端
    • 打开 Docker Desktop 设置
    • 进入 General 选项卡,勾选 Use the WSL 2 based engine
  • 启用 Windows 容器支持(可选,但建议启用)
1.2 下载 Milvus
bash 复制代码
git clone https://github.com/milvus-io/milvus.git cd milvus
1.3 启动 Milvus
bash 复制代码
docker-compose up -d
  • 该命令会下载 Milvus 并启动默认的服务,端口 19530 可用于 API 访问。

方法 2:使用 WSL 安装 Milvus
2.1 启用 WSL
bash 复制代码
wsl --install
  • 确保 WSL 版本为 2:
bash 复制代码
wsl --set-default-version 2
  • 安装 Ubuntu:
bash 复制代码
wsl --install -d Ubuntu
2.2 安装 Docker
bash 复制代码
sudo apt update // 更新软件包列表
sudo apt install -y docker.io // 安装 Docker
sudo apt install docker-compose -y // 安装 docker-compose
2.3 下载并启动 Milvus
bash 复制代码
cd ~ // 尝试在 WSL 内部的 Linux 文件系统(如 ~/)中克隆
git clone https://github.com/milvus-io/milvus.git 
cd milvus 
docker-compose up -d

4. Milvus 管理工具

3.1 Attu

  • Attu 是官方推荐的 Milvus 可视化管理工具:
  • 安装 Attu
bash 复制代码
docker run -d --name attu -p 3000:3000 zilliz/attu
  • 访问 http://localhost:3000

5. 默认接口、用户名、密码

配置项 默认值
接口 19530
用户名 无默认用户名
密码 无默认密码

注意 :默认情况下,Milvus 没有身份验证 。若需安全访问,可以通过代理层内部网权限控制实现认证。


6. 使用 Python 操作 Milvus

安装 pymilvus

bash 复制代码
pip install pymilvus

创建 Milvus 连接

python 复制代码
from pymilvus import connections

connections.connect(host="localhost", port="19530")

创建 Collection

python 复制代码
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)

插入数据

python 复制代码
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])

创建索引

python 复制代码
index_params = {
    "metric_type": "L2",   # 余弦相似度/欧式距离
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128}
}

collection.create_index(field_name="vector", index_params=index_params)

查询相似向量

python 复制代码
# 生成查询向量
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}")

7. 使用 Java 操作 Milvus

7.1 安装 Java 依赖

pom.xml 添加:

XML 复制代码
<dependency>
    <groupId>io.milvus</groupId>
    <artifactId>milvus-sdk-java</artifactId>
    <version>2.3.2</version>
</dependency>

7.2 连接 Milvus

java 复制代码
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");
    }
}

7.3 创建 Collection

java 复制代码
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");
    }
}

7.4 插入数据

java 复制代码
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<Long> ids = Arrays.asList(1L, 2L, 3L);
        List<List<Float>> 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");
    }
}

7.5 查询相似向量

java 复制代码
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<List<Float>> 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));
    }
}

8. SaaS 化系统的多租户支持

SaaS 系统中,每个租户(Tenant)应有独立的数据管理方案:

方法 1:独立 Collection

  • 每个租户一个 Collection,例如 tenant1_vectorstenant2_vectors
  • 适用于小规模租户

方法 2:添加租户字段

  • 在同一 Collection 里添加 tenant_id 字段:
javascript 复制代码
{ "id": 123, "tenant_id": "tenant_A", "vector": [0.1, 0.2, ...] }
  • 查询时加上租户过滤:
java 复制代码
SearchParam searchParam = SearchParam.newBuilder() .withCollectionName("example_collection") .withFilter("tenant_id = 'tenant_A'") .build();

方法 3:使用多个 Milvus 实例

  • 适用于大型 SaaS 平台
  • 每个租户一个独立的 Milvus 集群
  • 需要负载均衡和资源隔离

9. Milvus 的应用场景

1) 语义搜索

  • 结合 OpenAI Embeddings,可用于语义搜索(文本相似度计算)。

2) 图像搜索

  • 存储图片特征向量,实现以图搜图功能。

3) 推荐系统

  • 存储用户兴趣向量,计算个性化推荐

4) 生物信息学

  • DNA 比对,通过向量相似性计算基因相似度。

10. Milvus vs 其他向量数据库

数据库 主要特点 适用场景
Milvus 分布式、云原生、多索引支持 NLP、推荐系统、大规模向量数据
FAISS 高效 GPU 加速,适用于离线任务 超大规模数据离线处理
Pinecone 云托管,易用性强 SaaS 应用、无需自己部署
Weaviate 结合语义搜索,支持 JSON 存储 文本搜索、知识库
HNSWlib 高速图索引,适合小型应用 小规模向量检索

11. 总结

  • Milvus 是一个高性能、可扩展的向量数据库 ,适用于大规模 AI 应用,尤其适用于NLP、计算机视觉、推荐系统等场景。
  • 支持多种索引算法(HNSW、IVF-FLAT、IVF-PQ),可以根据不同的需求进行优化。
  • 兼容 PyTorch、TensorFlow、Hugging Face,易于集成到 AI 生态系统中。
  • 支持分布式部署,适合云端应用,可以利用 Kubernetes 进行管理。

如果你需要处理数千万甚至上亿的向量数据,Milvus 是一个非常好的选择!

相关推荐
奇迹气泡5 分钟前
数据库基本建表操作
数据库
RisingWave中文开源社区2 小时前
经验分享|用开源产品构建一个高性能实时推荐引擎
数据库·后端·开源
阿里云大数据AI技术2 小时前
基于 Megatron 的多模态大模型训练加速技术解析
人工智能·开源
小小工匠3 小时前
OpenSource - Apache POI 的 Word 模板引擎 poi-tl
开源·word·apache·poi-tl
m0_694845573 小时前
使用服务器搭建开源问答平台Answer
linux·运维·服务器·游戏·开源·云计算
jay丿3 小时前
Django 初始化导入数据详解
数据库·django·sqlite
CodeJourney.3 小时前
用DEEPSEEK做数据看板:高效、实用与创新的融合
数据库·人工智能·python·算法
xuanloyer3 小时前
第二篇《Active Data Guard 实战:打造高可用数据库》(ADG)
运维·数据库·oracle
小王不会写code5 小时前
Unknown collation: ‘utf8mb4_0900_ai_ci‘
数据库·mysql
局外人LZ5 小时前
windows安装Neo4j图数据库
数据库·windows·neo4j