🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Руководство пользователя
  • Home
  • Docs
  • Руководство пользователя

  • Индексы

  • Векторные индексы

  • Индексные векторные поля

Индексирование векторных полей

В этом руководстве рассматриваются основные операции по созданию и управлению индексами векторных полей в коллекции.

Обзор

Используя метаданные, хранящиеся в индексном файле, Milvus организует ваши данные в специализированную структуру, облегчая быстрое извлечение запрашиваемой информации при поиске или запросах.

Milvus предоставляет несколько типов индексов и метрик для сортировки значений полей для эффективного поиска по сходству. В следующей таблице перечислены поддерживаемые типы индексов и метрики для различных типов векторных полей. В настоящее время Milvus поддерживает различные типы векторных данных, включая вкрапления с плавающей точкой (часто называемые векторами с плавающей точкой или плотными векторами), двоичные вкрапления (также известные как двоичные векторы) и разреженные вкрапления (также известные как разреженные векторы). Подробнее см. в разделе Индекс в памяти и метрики сходства.

Типы метрик Типы индексов
  • Евклидово расстояние (L2)
  • Внутреннее произведение (IP)
  • Косинусное сходство (COSINE)
  • FLAT
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
Метрические типы Типы индексов
  • Жаккард (JACCARD)
  • Хэмминг (HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
Метрические типы Типы индексов
IP SPARSE_INVERTED_INDEX

Начиная с Milvus 2.5.4 и далее, SPARSE_WAND устаревает. Вместо него рекомендуется использовать "inverted_index_algo": "DAAT_WAND" для эквивалентности и сохранения совместимости. Для получения дополнительной информации обратитесь к разделу Sparse Vector.

Рекомендуется создавать индексы как для векторного поля, так и для скалярных полей, к которым часто обращаются.

Подготовка

Как объясняется в разделе "Управление коллекциями", Milvus автоматически генерирует индекс и загружает его в память при создании коллекции, если в запросе на создание коллекции указано одно из следующих условий:

  • размерность векторного поля и тип метрики, или

  • Схема и параметры индекса.

В приведенном ниже фрагменте кода используется существующий код для установления соединения с экземпляром Milvus и создания коллекции без указания параметров индекса. В этом случае коллекция не имеет индекса и остается незагруженной.

Чтобы подготовиться к индексированию, используйте MilvusClient чтобы подключиться к серверу Milvus и создать коллекцию с помощью create_schema(), add_field(), и create_collection().

Чтобы подготовиться к индексированию, используйте MilvusClientV2 для подключения к серверу Milvus и настройки коллекции с помощью createSchema(), addField(), и createCollection().

Чтобы подготовиться к индексированию, используйте MilvusClient для подключения к серверу Milvus и настройки коллекции с помощью createCollection().

from pymilvus import MilvusClient, DataType

# 1. Set up a Milvus client
client = MilvusClient(
    uri="http://localhost:19530"
)

# 2. Create schema
# 2.1. Create schema
schema = MilvusClient.create_schema(
    auto_id=False,
    enable_dynamic_field=True,
)

# 2.2. Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)

# 3. Create collection
client.create_collection(
    collection_name="customized_setup", 
    schema=schema, 
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;

String CLUSTER_ENDPOINT = "http://localhost:19530";

// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder()
    .uri(CLUSTER_ENDPOINT)
    .build();

MilvusClientV2 client = new MilvusClientV2(connectConfig);

// 2. Create a collection

// 2.1 Create schema
CreateCollectionReq.CollectionSchema schema = client.createSchema();

// 2.2 Add fields to schema
schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());
schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(5).build());

// 3 Create a collection without schema and index parameters
CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
.collectionName("customized_setup")
.collectionSchema(schema)
.build();

client.createCollection(customizedSetupReq);
// 1. Set up a Milvus Client
client = new MilvusClient({address, token});

// 2. Define fields for the collection
const fields = [
    {
        name: "id",
        data_type: DataType.Int64,
        is_primary_key: true,
        autoID: false
    },
    {
        name: "vector",
        data_type: DataType.FloatVector,
        dim: 5
    },
]

// 3. Create a collection
res = await client.createCollection({
    collection_name: "customized_setup",
    fields: fields,
})

console.log(res.error_code)  

// Output
// 
// Success
// 

Индексирование коллекции

Чтобы создать индекс для коллекции или проиндексировать коллекцию, используйте prepare_index_params() для подготовки параметров индекса и create_index() чтобы создать индекс.

Чтобы создать индекс для коллекции или проиндексировать коллекцию, используйте IndexParam для подготовки параметров индекса и createIndex() чтобы создать индекс.

Чтобы создать индекс для коллекции или проиндексировать коллекцию, используйте createIndex().

# 4.1. Set up the index parameters
index_params = MilvusClient.prepare_index_params()

# 4.2. Add an index on the vector field.
index_params.add_index(
    field_name="vector",
    metric_type="COSINE",
    index_type="IVF_FLAT",
    index_name="vector_index",
    params={ "nlist": 128 }
)

# 4.3. Create an index file
client.create_index(
    collection_name="customized_setup",
    index_params=index_params,
    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
)
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.index.request.CreateIndexReq;

// 4 Prepare index parameters

// 4.2 Add an index for the vector field "vector"
IndexParam indexParamForVectorField = IndexParam.builder()
    .fieldName("vector")
    .indexName("vector_index")
    .indexType(IndexParam.IndexType.IVF_FLAT)
    .metricType(IndexParam.MetricType.COSINE)
    .extraParams(Map.of("nlist", 128))
    .build();

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

// 4.3 Crate an index file
CreateIndexReq createIndexReq = CreateIndexReq.builder()
    .collectionName("customized_setup")
    .indexParams(indexParams)
    .build();

client.createIndex(createIndexReq);
// 4. Set up index for the collection
// 4.1. Set up the index parameters
res = await client.createIndex({
    collection_name: "customized_setup",
    field_name: "vector",
    index_type: "AUTOINDEX",
    metric_type: "COSINE",   
    index_name: "vector_index",
    params: { "nlist": 128 }
})

console.log(res.error_code)

// Output
// 
// Success
// 
Параметр Описание
field_name Имя целевого файла, к которому применяется данный объект.
metric_type Алгоритм, который используется для измерения сходства между векторами. Возможные значения: IP, L2, COSINE, JACCARD, HAMMING. Этот параметр доступен только в том случае, если указанное поле является векторным полем. Дополнительную информацию см. в разделе Индексы, поддерживаемые в Milvus.
index_type Имя алгоритма, используемого для упорядочивания данных в конкретном поле. Применимые алгоритмы см. в разделах Индекс в памяти и Индекс на диске.
index_name Имя индексного файла, созданного после применения данного объекта.
params Параметры тонкой настройки для указанного типа индекса. Подробные сведения о возможных ключах и диапазонах значений см. в разделе Индекс в памяти.
collection_name Имя существующей коллекции.
index_params Объект IndexParams, содержащий список объектов IndexParam.
sync Управляет тем, как строится индекс по отношению к запросу клиента. Допустимые значения:
  • True (по умолчанию): Клиент ждет, пока индекс будет полностью построен, прежде чем вернуться. Это означает, что вы не получите ответа, пока процесс не будет завершен.
  • False: Клиент возвращается сразу после получения запроса, а индекс строится в фоновом режиме. Чтобы узнать, завершилось ли создание индекса, используйте метод describe_index().
Параметр Описание
fieldName Имя целевого поля, к которому применяется данный объект IndexParam.
indexName Имя индексного файла, созданного после применения данного объекта.
indexType Имя алгоритма, используемого для упорядочивания данных в конкретном поле. Применимые алгоритмы см. в разделах Индекс в памяти и Индекс на диске.
metricType Метрика расстояния, используемая для индекса. Возможные значения: IP, L2, COSINE, JACCARD, HAMMING.
extraParams Дополнительные параметры индекса. Подробнее см. в разделах Индекс в памяти и Индекс на диске.
Параметр Описание
collection_name Имя существующей коллекции.
field_name Имя поля, в котором нужно создать индекс.
index_type Тип создаваемого индекса.
metric_type Тип метрики, используемой для измерения векторного расстояния.
index_name Имя создаваемого индекса.
params Другие специфические для индекса параметры.

примечания

В настоящее время для каждого поля коллекции можно создать только один индексный файл.

Проверка сведений об индексе

После создания индекса можно проверить его детали.

Чтобы проверить сведения об индексе, используйте list_indexes() чтобы перечислить имена индексов и describe_index() чтобы получить сведения об индексе.

Чтобы проверить сведения об индексе, используйте describeIndex() чтобы получить сведения об индексе.

Чтобы проверить сведения об индексе, используйте describeIndex() чтобы получить сведения об индексе.

# 5. Describe index
res = client.list_indexes(
    collection_name="customized_setup"
)

print(res)

# Output
#
# [
#     "vector_index",
# ]

res = client.describe_index(
    collection_name="customized_setup",
    index_name="vector_index"
)

print(res)

# Output
#
# {
#     "index_type": ,
#     "metric_type": "COSINE",
#     "field_name": "vector",
#     "index_name": "vector_index"
# }
import io.milvus.v2.service.index.request.DescribeIndexReq;
import io.milvus.v2.service.index.response.DescribeIndexResp;

// 5. Describe index
// 5.1 List the index names
ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    .collectionName("customized_setup")
    .build();

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

System.out.println(indexNames);

// Output:
// [
//     "vector_index"
// ]

// 5.2 Describe an index
DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
    .collectionName("customized_setup")
    .indexName("vector_index")
    .build();

DescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);

System.out.println(JSONObject.toJSON(describeIndexResp));

// Output:
// {
//     "metricType": "COSINE",
//     "indexType": "AUTOINDEX",
//     "fieldName": "vector",
//     "indexName": "vector_index"
// }
// 5. Describe the index
res = await client.describeIndex({
    collection_name: "customized_setup",
    index_name: "vector_index"
})

console.log(JSON.stringify(res.index_descriptions, null, 2))

// Output
// 
// [
//   {
//     "params": [
//       {
//         "key": "index_type",
//         "value": "AUTOINDEX"
//       },
//       {
//         "key": "metric_type",
//         "value": "COSINE"
//       }
//     ],
//     "index_name": "vector_index",
//     "indexID": "449007919953063141",
//     "field_name": "vector",
//     "indexed_rows": "0",
//     "total_rows": "0",
//     "state": "Finished",
//     "index_state_fail_reason": "",
//     "pending_index_rows": "0"
//   }
// ]
// 

Вы можете проверить индексный файл, созданный для определенного поля, и собрать статистику по количеству строк, проиндексированных с помощью этого индексного файла.

Сбросить индекс

Вы можете просто отказаться от индекса, если он больше не нужен.

Прежде чем сбрасывать индекс, убедитесь, что он был освобожден.

Чтобы удалить индекс, используйте команду drop_index().

Чтобы удалить индекс, используйте dropIndex().

Чтобы сбросить индекс, используйте dropIndex().

# 6. Drop index
client.drop_index(
    collection_name="customized_setup",
    index_name="vector_index"
)
// 6. Drop index

DropIndexReq dropIndexReq = DropIndexReq.builder()
    .collectionName("customized_setup")
    .indexName("vector_index")
    .build();

client.dropIndex(dropIndexReq);
// 6. Drop the index
res = await client.dropIndex({
    collection_name: "customized_setup",
    index_name: "vector_index"
})

console.log(res.error_code)

// Output
// 
// Success
// 

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?