距离计算公式
Milvus 基于不同的距离计算方式比较向量间的距离。根据插入数据的形式,选择合适的距离计算方式能极大地提高数据分类和聚类性能。
浮点型向量主要使用以下距离计算公式:
- 欧氏距离 (L2): 主要运用于计算机视觉领域。
- 内积 (IP): 主要运用于自然语言处理(NLP)领域。
二值型向量主要使用以下距离计算公式:
- 汉明距离 (Hamming): 主要运用于自然语言处理(NLP)领域。
- 杰卡德距离 (Jaccard): 主要运用于化学分子式检索领域。
- 谷本距离 (Tanimoto): 主要运用于化学分子式检索领域。
- 超结构 (Superstructure): 主要运用于检索化学分子式的相似超结构。
- 子结构 (Substructure): 主要运用于检索化学分子式的相似子结构。
Milvus 目前支持的距离计算方式与数据格式、索引类型之间的兼容关系以下表格所示。
数据格式 | 距离计算方式 | 索引类型 |
浮点型向量 | 欧氏距离 (L2) 内积 (IP) |
FLAT IVF_FLAT IVF_SQ8 IVF_PQ HNSW IVF_HNSW RHNSW_FLAT RHNSW_SQ RHNSW_PQ ANNOY |
二值型向量 | 杰卡德距离 (Jaccard) 谷本距离 (Tanimoto) 汉明距离 (Hamming) |
BIN_FLAT BIN_IVF_FLA |
二值型向量 | 超结构 (superstructure) 子结构 (substructure) |
BIN_FLAT |
Schema
字段Schema
字段Schema是字段的逻辑定义。 这是在定义集合Schema和创建集合之前需要去定义的。
注:Milvus 2.0 只支持一个集合中的一个主键字段。
字段 schema 属性
属性 | 描述 | 注释 |
name | 集合中字段的名称 | 数据类型:String。必须的 |
dtype | 字段的数据类型 | 必须的 |
description | 字段的描述 | 数据类型: String。可选的 |
is_primary | 是否将该字段设置为主键字段 | 数据类型: Boolean (true or false )。 主键字段为必填项 |
dim | 向量的维数 | 数据类型: Integer ∈[1, 32768]。对于向量字段是必需的 |
创建一个字段 schema
from pymilvus import FieldSchema # 主键 id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id") age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age") embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector") 复制代码
字段支持的数据类型
DataType
定义字段包含的数据类型。 不同的字段支持不同的数据类型。
- 主键字段支持的数据类型:
- INT8: numpy.int8
- INT16: numpy.int16
- INT32: numpy.int32
- INT64: numpy.int64
- 标量字段支持的数据类型:
- BOOL: Boolean (
true
orfalse
) - INT8: numpy.int8
- INT16: numpy.int16
- INT32: numpy.int32
- INT64: numpy.int64
- FLOAT: numpy.float32
- DOUBLE: numpy.double
- 向量字段支持的数据类型:
- BINARY_VECTOR: Binary vector
- FLOAT_VECTOR: Float vector
集合 Schema
集合 schema 是 集合 的逻辑定义。通常你需要在定义 集合 schema 和创建集合之前定义字段 schema。
集合 schema 的属性
属性 | 描述 | 备注 |
field | 要创建的 collection 中的 field | 强制 |
description | collection 描述 | 数据类型:String。 可选 |
auto_id | 是否启用自动分配 ID (即 primary key) | 数据类型:Boolean (true 或 false )。 可选 |
创建一个集合 schema
先定义字段 schema,再定义集合 schema。
from pymilvus import FieldSchema, CollectionSchema id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id") age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age") embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector") schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, description="desc of a collection") 复制代码
使用指定的 schema 创建集合:
from pymilvus import Collection collection_name1 = "tutorial_1" collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2) 复制代码
注意: 你可以使用 shards_num
参数定义分片编号,并通过在 using
中指定别名来定义您希望在哪个 Milvus 服务器中创建集合。
你也可以使用 Collection.construct_from_dataframe
自动从 DataFrame 生成一个 collection schema 并创建一个 collection。
import pandas as pd df = pd.DataFrame({ "id": [i for i in range(nb)], "age": [random.randint(20, 40) for i in range(nb)], "embedding": [[random.random() for _ in range(dim)] for _ in range(nb)] }) collection, ins_res = Collection.construct_from_dataframe( 'my_collection', df, primary_field='id', auto_id=False )