建设一个ETLPipeline,把数据复制进向量数据库。这样做的优点是可以使用灵活的向量索引,并保证在线检索的高性能,代价则是数据的多副本存储。以及后续每次商品目录变化、embedding 模型升级,字段补写,都要触发的数据同步工作。
直接查询数据湖。优点是无需复制数据;缺点是直接查询湖中的文件时,通常无法直接利用向量数据库为在线检索构建的 HNSW 等 ANN 索引,因此可能退化为大范围甚至全量扫描,难以满足生产环境的低延迟要求。
external_source,用于标识外部文件或数据表; external_spec,用于描述源数据格式和存储访问方式; external_field映射,用于把 Milvus schema 中的字段对应到外部数据集中的列; Milvus 为检索构建的索引、manifest 和服务状态。
01
External Collection如何支持在线离线多种负载,减少数据拷贝?
训练流程可以使用新模型生成 embedding; 数据质量任务可以发现格式错误或异常记录; 评测流程可以比较不同模型版本的检索质量; 批处理任务可以生成摘要、标签或新的元数据。
02
External Collection 的数据源支持与安全机制
03
如何创建、建立索引、Refresh 和查询 External Collection
定义外部数据源,并把其中的列映射到 Milvus schema; 定义当前工作负载需要的索引; 执行 Refresh,让 Milvus 发现源数据并准备一个可查询的数据版本; Load Collection,然后照常使用 Milvus 的 search 和 query API。
import jsonimport timefrom pymilvus import DataType, MilvusClientclient = MilvusClient(uri="http://localhost:19530",token="root:Milvus",)schema = client.create_schema(external_source="s3://my-lake/datasets/products/",external_spec=json.dumps({"format": "parquet","extfs": {"cloud_provider": "aws","region": "us-east-1","use_iam": "true","iam_endpoint": "https://sts.us-east-1.amazonaws.com",},}),)schema.add_field(field_name="id",datatype=DataType.INT64,external_field="product_id",)schema.add_field(field_name="embedding",datatype=DataType.FLOAT_VECTOR,dim=768,external_field="image_vec",)schema.add_field(field_name="title",datatype=DataType.VARCHAR,max_length=256,external_field="product_name",)schema.add_field(field_name="stock",datatype=DataType.INT64,external_field="stock",)schema.add_field(field_name="rating",datatype=DataType.FLOAT,external_field="rating",)client.create_collection(collection_name="products_ext",schema=schema,)
index_params = client.prepare_index_params()index_params.add_index(field_name="embedding",index_type="HNSW",metric_type="COSINE",)index_params.add_index(field_name="stock", index_type="AUTOINDEX")index_params.add_index(field_name="rating", index_type="AUTOINDEX")client.create_index(collection_name="products_ext",index_params=index_params,)
job_id = client.refresh_external_collection(collection_name="products_ext",)while True:progress = client.get_refresh_external_collection_progress(job_id=job_id)if progress.state == "RefreshCompleted":breakif progress.state == "RefreshFailed":raise RuntimeError(progress.reason)time.sleep(2)
client.load_collection("products_ext")results = client.search(collection_name="products_ext",data=[query_vec],anns_field="embedding",filter="stock > 0 and rating >= 4.0",limit=10,output_fields=["id", "title", "stock", "rating"],)
04
Refresh是如何获取外部数据变化的?
05
Lazy Loading :如何在内存中只定向加载需要字段的数据
06
External Collection 支持哪些搜索和索引能力
用于 ANN 搜索的向量索引; 用于元数据过滤的标量索引; 用于半结构化属性的 JSON 索引; 用于词法检索的 BM25 和全文索引; Milvus 数据模型支持的 Function 生成字段。
07
External Collection 适合什么场景,又不适合什么场景
权威数据已经存放在 Parquet、Vortex、Lance、Iceberg 或其他受支持的外部数据源中; 数据集主要通过批处理生成,而不是高频事务写入; 维护第二份服务副本会带来明显的 ETL、数据新鲜度或治理成本; 多个系统需要使用同一份开放数据; 可以接受以明确的 Refresh 边界来控制在线数据的新鲜度; 希望使用 Milvus 的生产级检索能力,但不希望让 Milvus 接管源数据记录。
External Collection 是只读的。源数据的修改发生在 Milvus 之外。 零复制指的是源数据记录。索引、manifest、缓存和计算资源仍然需要成本。 Refresh 需要显式执行。它不是流式同步机制。 外部数据源必须保持可访问。Search、索引构建和 Refresh 仍然依赖存储访问权限和凭证。 需要 Storage V3。在开源 Milvus 3.0 中,使用 External Collection 前必须先启用 Storage V3。 External Collection 不会替代上游处理。Embedding 生成、聚类、去重和数据清洗,仍然由相应的上游系统完成。
作者介绍

刘伟
Staff Software Engineer at Zilliz
阅读推荐官宣开源|Milvus 3.0 正式发布Milvus 3.0 开源解读之backfill|亿级 AI 数据,如何做高效特征回填Milvus 3.0 开源解读|从Kafka、Pulsar到Woodpecker,数据库如何低延迟、低成本的写入Milvus 3.0 开源解读之Manifest|AI 数据管理,应该彻底放弃文件中心架构Milvus 3.0 开源解读之,数据库原生聚合排序如何取代应用侧Pandas胶水代码Milvus 3.0开源解读之Regex |从=~到NGRAM,如何选择最优性价比的正则过滤Milvus 3.0 开源解读之Snapshot|无需复制embedding数据的Milvus Collection视图Milvus 3.0 开源解读|自定义词典如何优化BM25 与Text Match 的专业词理解能力Milvus 3.0 开源解读|如何借助原生 TEXT 类型和 LOB 高效管理原始文本
Milvus 3.0 开源解读|词法+语义高亮,如何解决Agent的搜索噪音?Milvus 3.0开源解读|从Entity到Element,StructArray 如何重构多向量检索