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 | 字符串 | 向量元素的数据类型。有效值为 binarybytefloat。可选。默认为 floatspace_type | 字符串 | 用于计算向量之间距离的向量空间。有效值为 l1l2linfcosinesimilinnerproducthamminghammingbit。并非每个方法/引擎组合都支持所有空间。有关支持的空间列表,请参阅特定引擎的章节。注意:此值也可以在 method 内指定。可选。更多信息,请参阅 空间mode | 字符串 | 根据您的优先级(低延迟或低成本)设置适当的 k-NN 参数默认值。有效值为 in_memoryon_disk。可选。默认为 in_memory。更多信息,请参阅 内存优化向量compression_level | 字符串 | 选择一个量化编码器,将向量内存消耗减少给定的倍数。有效值为 1x2x4x8x16x32x。可选。更多信息,请参阅 内存优化向量method | 对象 | 在索引时组织向量数据并在搜索时搜索向量数据的算法。当 ANN 算法不需要训练时使用。可选。更多信息,请参阅 方法和引擎model_id | 字符串 | 已训练模型的模型 ID。当 ANN 算法需要训练时使用。参见 模型 ID。可选。

后续步骤