跳到主要内容

标量字段索引

在 Milvus 中,标量索引用于加速通过特定非向量字段值进行的元过滤,类似于传统数据库索引。本指南将引导您创建和配置标量字段的索引,例如整数、字符串等。

标量索引类型

  • 自动索引: Milvus 根据标量字段的数据类型自动决定索引类型。当您不需要控制特定索引类型时,这是合适的选择。

  • 自定义索引: 您可以指定精确的索引类型,例如倒排索引。这提供了对索引类型选择更多的控制。

自动索引

要使用自动索引,在 add_index() 中省略 index_type 参数,这样 Milvus 可以根据标量字段类型推断索引类型。

要使用自动索引,在 IndexParam 中省略 indexType 参数,这样 Milvus 可以根据标量字段类型推断索引类型。

要使用自动索引,在 createIndex() 中省略 index_type 参数,这样 Milvus 可以根据标量字段类型推断索引类型。

有关标量数据类型与默认索引算法之间的映射,请参阅标量字段索引算法

# 自动索引
client = MilvusClient(
uri="http://localhost:19530"
)

index_params = client.create_index_params() # 准备一个空的 IndexParams 对象,无需指定任何索引参数

index_params.add_index(
field_name="scalar_1", # 要索引的标量字段的名称
index_type="", # 要创建的索引类型。对于自动索引,保持为空或省略此参数。
index_name="default_index" # 要创建的索引的名称
)

client.create_index(
collection_name="test_scalar_index", # 指定集合名称
index_params=index_params
)
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.index.request.CreateIndexReq;

IndexParam indexParamForScalarField = IndexParam.builder()
.fieldName("scalar_1") // 要建立索引的标量字段的名称
.indexName("default_index") // 要创建的索引的名称
.indexType("") // 要创建的索引类型。对于自动索引,请将其保留为空或省略此参数。
.build();

List<IndexParam> indexParams = new ArrayList<>();
indexParams.add(indexParamForVectorField);

CreateIndexReq createIndexReq = CreateIndexReq.builder()
.collectionName("test_scalar_index") // 指定集合名称
.indexParams(indexParams)
.build();

client.createIndex(createIndexReq);
await client.createIndex({
collection_name: "test_scalar_index", // 指定集合名称
field_name: "scalar_1", // 要创建索引的标量字段名称
index_name: "default_index", // 要创建的索引名称
index_type: "" // 要创建的索引类型。对于自动索引,请将其保留为空或省略此参数。
})

自定义索引

要使用自定义索引,请在 add_index() 中使用 index_type 参数指定特定的索引类型。

要使用自定义索引,请在 IndexParam 中使用 indexType 参数指定特定的索引类型。

要使用自定义索引,请在 createIndex() 中使用 index_type 参数指定特定的索引类型。

index_params = client.create_index_params() # 准备一个 IndexParams 对象

index_params.add_index(
field_name="scalar_2", # 要创建索引的标量字段名称
index_type="INVERTED", # 要创建的索引类型
index_name="inverted_index" # 要创建的索引名称
)

client.create_index(
collection_name="test_scalar_index", # 指定集合名称
index_params=index_params
)
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.index.request.CreateIndexReq;

IndexParam indexParamForScalarField = IndexParam.builder()
.fieldName("scalar_1") // 要创建索引的标量字段名称
.indexName("inverted_index") // 要创建的索引名称
.indexType("INVERTED") // 要创建的索引类型
.build();

List<IndexParam> indexParams = new ArrayList<>();
indexParams.add(indexParamForVectorField);

CreateIndexReq createIndexReq = CreateIndexReq.builder()
.collectionName("test_scalar_index") // 指定集合名称
.indexParams(indexParams)
.build();

client.createIndex(createIndexReq);
await client.createIndex({
collection_name: "test_scalar_index", // 指定集合名称
field_name: "scalar_1", // 要创建索引的标量字段名称
index_name: "inverted_index", // 要创建的索引名称
index_type: "INVERTED" // 要创建的索引类型
})

方法和参数

  • create_index_params()

    准备一个 IndexParams 对象。

  • add_index()

    将索引配置添加到 IndexParams 对象中。

    • field_name字符串

      要索引的标量字段的名称。

    • index_type字符串):

创建标量索引

要创建的标量索引的类型。对于隐式索引,请将其保留为空或省略此参数。

对于自定义索引,有效值包括:

  • INVERTED:(推荐)倒排索引包含一个按字母顺序排列的包含所有标记化单词的术语词典。有关详细信息,请参阅标量索引。

  • STL_SORT:使用标准模板库排序算法对标量字段进行排序。支持布尔值和数值字段(例如,INT8、INT16、INT32、INT64、FLOAT、DOUBLE)。

  • Trie:用于快速前缀搜索和检索的树数据结构。支持VARCHAR字段。

  • index_name字符串

    要创建的标量索引的名称。每个标量字段支持一个索引。

  • create_index()

    在指定的集合中创建索引。

    • collection_name字符串

      创建索引的集合的名称。

    • index_params

      包含索引配置的__IndexParams__对象。

方法和参数

  • IndexParam 准备一个IndexParam对象。
    • fieldName字符串) 要索引的标量字段的名称。
    • indexName字符串) 要创建的标量索引的名称。每个标量字段支持一个索引。
    • indexType字符串) 要创建的标量索引的类型。对于隐式索引,请将其保留为空或省略此参数。 对于自定义索引,有效值包括:
      • INVERTED:(推荐)倒排索引包含一个按字母顺序排列的包含所有标记化单词的术语词典。有关详细信息,请参阅标量索引。
      • STL_SORT:使用标准模板库排序算法对标量字段进行排序。支持布尔值和数值字段(例如,INT8、INT16、INT32、INT64、FLOAT、DOUBLE)。
      • Trie:用于快速前缀搜索和检索的树数据结构。支持VARCHAR字段。
  • CreateIndexReq 在指定的集合中创建索引。
    • collectionName字符串) 创建索引的集合的名称。
    • indexParamsList<IndexParam>) 包含索引配置的IndexParam对象列表。

方法和参数

  • createIndex

    在指定的集合中创建索引。

    • collection_name字符串) 创建索引的集合的名称。
    • field_name字符串) 要索引的标量字段的名称。
    • index_name字符串) 要创建的标量索引的名称。每个标量字段支持一个索引。
    • index_type字符串) 要创建的标量索引的类型。对于隐式索引,请将其保留为空或省略此参数。 对于自定义索引,有效值包括:
      • 倒排索引: (推荐)倒排索引由包含所有按字母顺序排序的标记化单词的词典组成。详情请参考标量索引
      • STL_SORT: 使用标准模板库排序算法对标量字段进行排序。支持布尔和数值字段(例如,INT8,INT16,INT32,INT64,FLOAT,DOUBLE)。
      • Trie: 用于快速前缀搜索和检索的树数据结构。支持VARCHAR字段。

验证结果

使用 list_indexes() 方法来验证标量索引的创建:

使用 listIndexes() 方法来验证标量索引的创建:

使用 listIndexes() 方法来验证标量索引的创建:

client.list_indexes(
collection_name="test_scalar_index" # 指定集合名称
)

# 输出:
# ['default_index','inverted_index']
import java.util.List;
import io.milvus.v2.service.index.request.ListIndexesReq;

ListIndexesReq listIndexesReq = ListIndexesReq.builder()
.collectionName("test_scalar_index") // 指定集合名称
.build();

List<String> indexNames = client.listIndexes(listIndexesReq);

System.out.println(indexNames);

// 输出:
// [
// "default_index",
// "inverted_index"
// ]
res = await client.listIndexes({
collection_name: 'test_scalar_index'
})

console.log(res.indexes)

// 输出:
// [
// "default_index",
// "inverted_index"
// ]

限制

  • 目前,标量索引支持 INT8、INT16、INT32、INT64、FLOAT、DOUBLE、BOOL 和 VARCHAR 数据类型,但不支持 JSON 和 ARRAY 类型。