建立索引(build_index)

在Milvus上构建向量索引

本指南描述了如何在Milvus上构建向量索引。

向量索引是用于加速向量相似性搜索的元数据的组织单元。如果没有在向量上构建索引,Milvus将默认执行暴力搜索。

有关向量索引的机制和种类的更多信息,请参见向量索引

默认情况下,Milvus不会对小于1,024行的段进行索引。要更改此参数,请在milvus.yaml中配置rootCoord.minSegmentSizeToEnableIndex

以下示例使用欧几里得距离(L2)作为相似度指标构建了一个1,024个簇的IVF_FLAT索引。您可以选择适合您情境的索引和指标。有关更多信息,请参阅相似度指标

准备索引参数

将索引参数准备如下:

Python Java GO Node.js CLI Curl

index_params = {
  "metric_type":"L2",
  "index_type":"IVF_FLAT",
  "params":{"nlist":1024}
}
 
const index_params = {
  metric_type: "L2",
  index_type: "IVF_FLAT",
  params: JSON.stringify({ nlist: 1024 }),
};
 
idx, err := entity.NewIndexIvfFlat(   // NewIndex func
    entity.L2,                        // metricType
    1024,                             // ConstructParams
)
if err != nil {
  log.Fatal("fail to create ivf flat index parameter:", err.Error())
}
 
final IndexType INDEX_TYPE = IndexType.IVF_FLAT;   // IndexType
final String INDEX_PARAM = "{"nlist":1024}";     // ExtraParam
 
create index
 
Collection name (book): book
 
The name of the field to create an index for (book_intro): book_intro
 
Index type (FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY): IVF_FLAT
 
Index metric type (L2, IP, HAMMING, TANIMOTO): L2
 
Index params nlist: 1024
 
Timeout []:
 
curl -X 'POST' 
  'http://localhost:9091/api/v1/index' 
  -H 'accept: application/json' 
  -H 'Content-Type: application/json' 
  -d '{
    "collection_name": "book",
    "field_name": "book_intro",
    "extra_params":[
      {"key": "metric_type", "value": "L2"},
      {"key": "index_type", "value": "IVF_FLAT"},
      {"key": "params", "value": "{"nlist":1024}"}
    ]
  }'
 

很抱歉,我再次失误了。以下是正确的中文翻译及表格格式:

参数描述选项
metric_type用于衡量向量相似度的度量类型。对于浮点型向量:L2(欧几里得距离)、IP(内积);对于二元型向量:JACCARD(Jaccard距离)、TANIMOTO(Tanimoto距离)、HAMMING(Hamming距离)、SUPERSTRUCTURE(超结构)、SUBSTRUCTURE(子结构)
index_type用于加速向量搜索的索引类型。对于浮点型向量:FLAT(FLAT)、IVF_FLAT(IVF_FLAT)、IVF_SQ8(IVF_SQ8)、IVF_PQ(IVF_PQ)、HNSW(HNSW)、ANNOY(ANNOY);对于二元型向量:BIN_FLAT(BIN_FLAT)、BIN_IVF_FLAT(BIN_IVF_FLAT)
params指定建立索引的参数。更多信息请参见内存索引磁盘索引。 * DISKANN 有一些特定要求要满足。详情请参见磁盘索引

非常感谢您的指导,以下是修改后的表格及翻译:

参数描述选项
NewIndex func根据不同的索引类型创建实体索引的函数。对于浮点类型向量:NewIndexFlat(FLAT)、NewIndexIvfFlat(IVF_FLAT)、NewIndexIvfSQ8(IVF_SQ8)、NewIndexIvfPQ(IVF_PQ)、NewIndexHNSW(HNSW)、NewIndexANNOY(ANNOY)、NewIndexDISKANN*(DISK_ANN); 对于二元类型向量:NewIndexBinFlat(BIN_FLAT)、NewIndexBinIvfFlat(BIN_IVF_FLAT)
metricType用于衡量向量相似度的距离类型。对于浮点类型向量:L2(欧几里得距离)、IP(内积); 对于二元类型向量:JACCARD(Jaccard距离)、TANIMOTO(Tanimoto距离)、HAMMING(Hamming距离)、SUPERSTRUCTURE(超级结构)、SUBSTRUCTURE(子结构)
ConstructParams创建索引时需要用到的特定参数。更多信息请参见内存索引磁盘索引。 * DISKANN 有一些特定要求要满足。详情请参见磁盘索引
参数描述选项
IndexType用于加速向量搜索的索引类型。对于浮点类型向量:FLAT(FLAT)、IVF_FLAT(IVF_FLAT)、IVF_SQ8(IVF_SQ8)、IVF_PQ(IVF_PQ)、HNSW(HNSW)、ANNOY(ANNOY)、DISKANN*(DISK_ANN); 对于二元类型向量:BIN_FLAT(BIN_FLAT)、BIN_IVF_FLAT(BIN_IVF_FLAT)
ExtraParam创建索引时需要用到的特定参数。更多信息请参见内存索引磁盘索引。* DISKANN 有一些特定要求要满足。详情请参见磁盘索引
参数描述选项
metricType用于衡量向量相似度的距离类型。对于浮点类型向量:L2(欧几里得距离)、IP(内积); 对于二元类型向量:JACCARD(Jaccard距离)、TANIMOTO(Tanimoto距离)、HAMMING(Hamming距离)、SUPERSTRUCTURE(超级结构)、SUBSTRUCTURE(子结构)
NewIndex func根据不同的索引类型创建实体索引的函数。对于浮点类型向量:NewIndexFlat(FLAT)、NewIndexIvfFlat(IVF_FLAT)、NewIndexIvfSQ8(IVF_SQ8)、NewIndexIvfPQ(IVF_PQ)、NewIndexHNSW(HNSW)、NewIndexANNOY(ANNOY)、NewIndexDISKANN*(DISK_ANN); 对于二元类型向量:NewIndexBinFlat(BIN_FLAT)、NewIndexBinIvfFlat(BIN_IVF_FLAT)
ConstructParams创建索引时需要用到的特定参数。更多信息请参见[内存]
参数描述选项
collection_name构建索引的向量集合名称。
field_name构建索引的向量字段名称。
metric_type用于衡量向量相似度的距离类型。对于浮点类型向量:L2(欧几里德距离)、IP(内积); 对于二元类型向量:JACCARD(Jaccard距离)、TANIMOTO(Tanimoto距离)、HAMMING(汉明距离)、SUPERSTRUCTURE(超级结构)、SUBSTRUCTURE(子结构)
index_type用于加速向量搜索的索引类型。对于浮点类型向量:FLAT(FLAT)、IVF_FLAT(IVF_FLAT)、IVF_SQ8(IVF_SQ8)、IVF_PQ(IVF_PQ)、HNSW(HNSW)、ANNOY(ANNOY); 对于二元类型向量:BIN_FLAT(BIN_FLAT)、BIN_IVF_FLAT(BIN_IVF_FLAT)
params创建索引时需要用到的特定参数。更多信息请参见内存索引
--help显示命令使用的帮助信息。

建立索引

通过指定向量字段名称和索引参数来建立索引。

Python Java GO Node.js CLI Curl

from pymilvus import Collection, utility
# Get an existing collection.
collection = Collection("book")      
collection.create_index(
  field_name="book_intro", 
  index_params=index_params
)
 
utility.index_building_progress("book")
# Output: {'total_rows': 0, 'indexed_rows': 0}
 
await milvusClient.createIndex({
  collection_name: "book",
  field_name: "book_intro",
  extra_params: index_params,
});
 
err := milvusClient.CreateIndex(
  context.Background(),        // ctx
  "book",                      // CollectionName
  "book_intro",                // fieldName
  idx,                         // entity.Index
  false,                       // async
)
if err != nil {
  log.Fatal("fail to create index:", err.Error())
}
 
milvusClient.createIndex(
  CreateIndexParam.newBuilder()
    .withCollectionName("book")
    .withFieldName("book_intro")
    .withIndexType(INDEX_TYPE)
    .withMetricType(MetricType.L2)
    .withExtraParam(INDEX_PARAM)
    .withSyncMode(Boolean.FALSE)
    .build()
);
 
# Follow the previous step.
 
# Follow the previous step.
 
参数描述
field_name构建索引的向量字段名称。
index_params所要构建的索引的参数。
参数描述
collection_name在其中构建索引的向量集合名称。
field_name构建索引的向量字段名称。
extra_params所要构建的索引的参数。
参数描述
ctx控制 API 调用过程的上下文。
CollectionName构建索引的向量集合名称。
fieldName构建索引的向量字段名称。
entity.Index所要构建的索引的参数。
async控制同步/异步行为的开关。在同步构建过程中,上下文的截止时间不适用。

接下来是什么