Индексирование векторных полей
В этом руководстве рассматриваются основные операции по созданию и управлению индексами векторных полей в коллекции.
Обзор
Используя метаданные, хранящиеся в индексном файле, Milvus организует ваши данные в специализированную структуру, облегчая быстрое извлечение запрашиваемой информации при поиске или запросах.
Milvus предоставляет несколько типов индексов и метрик для сортировки значений полей для эффективного поиска по сходству. В следующей таблице перечислены поддерживаемые типы индексов и метрики для различных типов векторных полей. В настоящее время Milvus поддерживает различные типы векторных данных, включая вкрапления с плавающей точкой (часто называемые векторами с плавающей точкой или плотными векторами), двоичные вкрапления (также известные как двоичные векторы) и разреженные вкрапления (также известные как разреженные векторы). Подробнее см. в разделе Индекс в памяти и метрики сходства.
Типы метрик | Типы индексов |
---|---|
|
|
Метрические типы | Типы индексов |
---|---|
|
|
Метрические типы | Типы индексов |
---|---|
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 |
Управляет тем, как строится индекс по отношению к запросу клиента. Допустимые значения:
|
Параметр | Описание |
---|---|
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
//