k-NN 向量
knn_vector 数据类型允许您将向量摄入到 UDB-SX 索引中,并执行不同类型的向量搜索。knn_vector 字段高度可配置,可以满足许多不同的向量工作负载。通常,可以通过 提供方法定义 或 指定模型 ID 来构建 knn_vector 字段。
示例
要将 my_vector 映射为 knn_vector,请使用以下请求:
PUT /test-index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"my_vector": {
"type": "knn_vector",
"dimension": 3,
"space_type": "l2"
}
}
}
}
优化向量存储
为了优化向量存储,您可以指定 向量工作负载模式 为 in_memory(优化最低延迟)或 on_disk(优化最低成本)。on_disk 模式减少了内存使用。可选地,您可以指定 compression_level 来微调向量的内存消耗:
PUT test-index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"my_vector": {
"type": "knn_vector",
"dimension": 3,
"space_type": "l2",
"mode": "on_disk",
"compression_level": "16x"
}
}
}
}
方法定义
当底层的 近似 k-NN (ANN) 算法不需要训练时,会使用 方法定义。例如,以下 knn_vector 字段指定应使用 Faiss 实现的 HNSW 进行 ANN 搜索。在索引期间,Faiss 会构建相应的 HNSW 段文件:
PUT test-index
{
"settings": {
"index": {
"knn": true,
"knn.algo_param.ef_search": 100
}
},
"mappings": {
"properties": {
"my_vector1": {
"type": "knn_vector",
"dimension": 1024,
"method": {
"name": "hnsw",
"space_type": "l2",
"engine": "faiss",
"parameters": {
"ef_construction": 100,
"m": 16
}
}
}
}
}
}
您也可以在顶层指定 space_type:
PUT test-index
{
"settings": {
"index": {
"knn": true,
"knn.algo_param.ef_search": 100
}
},
"mappings": {
"properties": {
"my_vector1": {
"type": "knn_vector",
"dimension": 1024,
"space_type": "l2",
"method": {
"name": "hnsw",
"engine": "faiss",
"parameters": {
"ef_construction": 100,
"m": 16
}
}
}
}
}
}
模型 ID
当底层的 ANN 算法需要训练步骤时,会使用模型 ID。作为前提条件,必须使用 训练 API 创建模型。该模型包含初始化原生库段文件所需的信息。要为向量字段配置模型,请指定 model_id:
"my_vector": {
"type": "knn_vector",
"model_id": "my-model"
}
但是,如果您打算使用 Painless 脚本或 k-NN 评分脚本,则只需传递 dimension:
"my_vector": {
"type": "knn_vector",
"dimension": 128
}
有关更多信息,请参阅 基于模型构建向量索引。
参数
下表列出了 k-NN 向量字段类型接受的参数。
参数 | 数据类型 | 描述
:— | :—
type | 字符串 | 向量字段类型。必须为 knn_vector。必需。
dimension | 整数 | 所使用的向量的大小。有效值在 [1, 16,000] 范围内。必需。
data_type | 字符串 | 向量元素的数据类型。有效值为 binary、byte 和 float。可选。默认为 float。
space_type | 字符串 | 用于计算向量之间距离的向量空间。有效值为 l1、l2、linf、cosinesimil、innerproduct、hamming 和 hammingbit。并非每个方法/引擎组合都支持所有空间。有关支持的空间列表,请参阅特定引擎的章节。注意:此值也可以在 method 内指定。可选。更多信息,请参阅 空间。
mode | 字符串 | 根据您的优先级(低延迟或低成本)设置适当的 k-NN 参数默认值。有效值为 in_memory 和 on_disk。可选。默认为 in_memory。更多信息,请参阅 内存优化向量。
compression_level | 字符串 | 选择一个量化编码器,将向量内存消耗减少给定的倍数。有效值为 1x、2x、4x、8x、16x 和 32x。可选。更多信息,请参阅 内存优化向量。
method | 对象 | 在索引时组织向量数据并在搜索时搜索向量数据的算法。当 ANN 算法不需要训练时使用。可选。更多信息,请参阅 方法和引擎。
model_id | 字符串 | 已训练模型的模型 ID。当 ANN 算法需要训练时使用。参见 模型 ID。可选。