milvus-logo
LFAI
Home
  • Benutzerhandbuch
    • Indizes

Vektorfelder indizieren

Dieser Leitfaden führt Sie durch die grundlegenden Vorgänge beim Erstellen und Verwalten von Indizes für Vektorfelder in einer Sammlung.

Übersicht

Durch die Nutzung der in einer Indexdatei gespeicherten Metadaten organisiert Milvus Ihre Daten in einer spezialisierten Struktur, die ein schnelles Auffinden der gewünschten Informationen bei Suchen oder Abfragen erleichtert.

Milvus bietet verschiedene Indextypen und Metriken zum Sortieren von Feldwerten für effiziente Ähnlichkeitssuchen. In der folgenden Tabelle sind die unterstützten Indextypen und Metriken für verschiedene Vektorfeldtypen aufgeführt. Derzeit unterstützt Milvus verschiedene Arten von Vektordaten, einschließlich Fließkomma-Einbettungen (oft auch als Fließkomma-Vektoren oder dichte Vektoren bezeichnet), binäre Einbettungen (auch als binäre Vektoren bezeichnet) und spärliche Einbettungen (auch als spärliche Vektoren bezeichnet). Weitere Informationen finden Sie unter Index- und Ähnlichkeitsmetriken im Arbeitsspeicher.

Metrische Typen Index-Typen
  • Euklidischer Abstand (L2)
  • Inneres Produkt (IP)
  • Kosinus-Ähnlichkeit (COSINE)
  • FLAT
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
Metrische Typen Index-Typen
  • Jaccard (JACCARD)
  • Hamming (HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
Metrische Typen Index-Typen
IP
  • SPÄRLICHER_INVERTIERTER_INDEX
  • SPARSE_WAND

Es wird empfohlen, Indizes sowohl für das Vektorfeld als auch für skalare Felder, auf die häufig zugegriffen wird, anzulegen.

Vorbereitungen

Wie in Sammlungen verwalten erläutert, generiert Milvus beim Erstellen einer Sammlung automatisch einen Index und lädt ihn in den Speicher, wenn eine der folgenden Bedingungen in der Anforderung zur Erstellung der Sammlung angegeben ist:

  • Die Dimensionalität des Vektorfeldes und der metrische Typ, oder

  • das Schema und die Indexparameter.

Das folgende Codeschnipsel nutzt den vorhandenen Code, um eine Verbindung zu einer Milvus-Instanz herzustellen und eine Sammlung ohne Angabe der Indexparameter zu erstellen. In diesem Fall hat die Sammlung keinen Index und bleibt ungeladen.

Um die Indizierung vorzubereiten, verwenden Sie MilvusClient um eine Verbindung zum Milvus-Server herzustellen und eine Sammlung einzurichten, indem Sie create_schema(), add_field(), und create_collection().

Um die Indizierung vorzubereiten, verwenden Sie MilvusClientV2 um sich mit dem Milvus-Server zu verbinden und eine Sammlung einzurichten, indem Sie createSchema(), addField()und createCollection().

Um die Indizierung vorzubereiten, verwenden Sie MilvusClient um sich mit dem Milvus-Server zu verbinden und eine Sammlung einzurichten, indem Sie 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
// 

Indizieren einer Sammlung

Um einen Index für eine Sammlung zu erstellen oder eine Sammlung zu indizieren, verwenden Sie prepare_index_params() um Indexparameter vorzubereiten und create_index() um den Index zu erstellen.

Um einen Index für eine Sammlung zu erstellen oder eine Sammlung zu indizieren, verwenden Sie IndexParam um Index-Parameter vorzubereiten und createIndex() um den Index zu erstellen.

Um einen Index für eine Sammlung oder einen Index für eine Sammlung zu erstellen, verwenden Sie 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
// 
Parameter Beschreibung
field_name Der Name der Zieldatei, auf die dieses Objekt angewendet wird.
metric_type Der Algorithmus, der verwendet wird, um die Ähnlichkeit zwischen Vektoren zu messen. Mögliche Werte sind IP, L2, COSINE, JACCARD, HAMMING. Diese Option ist nur verfügbar, wenn das angegebene Feld ein Vektorfeld ist. Weitere Informationen finden Sie unter In Milvus unterstützte Indizes.
index_type Der Name des Algorithmus, der für die Anordnung der Daten in einem bestimmten Feld verwendet wird. Die entsprechenden Algorithmen finden Sie unter In-Memory-Index und On-Disk-Index.
index_name Der Name der Indexdatei, die nach der Anwendung dieses Objekts erstellt wird.
params Die Feinabstimmungsparameter für den angegebenen Indextyp. Details zu den möglichen Schlüsseln und Wertebereichen finden Sie unter In-memory Index.
collection_name Der Name einer bestehenden Sammlung.
index_params Ein IndexParams-Objekt, das eine Liste von IndexParam-Objekten enthält.
sync Steuert, wie der Index in Bezug auf die Anfrage des Clients aufgebaut wird. Gültige Werte:
  • True (Standard): Der Client wartet, bis der Index vollständig aufgebaut ist, bevor er zurückkehrt. Das bedeutet, dass Sie keine Antwort erhalten, bis der Prozess abgeschlossen ist.
  • False: Der Client kehrt sofort zurück, nachdem die Anfrage eingegangen ist und der Index im Hintergrund aufgebaut wird. Um herauszufinden, ob die Indexerstellung abgeschlossen ist, verwenden Sie die Methode describe_index().
Parameter Beschreibung
fieldName Der Name des Zielfeldes, auf das dieses IndexParam-Objekt angewendet wird.
indexName Der Name der Indexdatei, die nach Anwendung dieses Objekts erstellt wurde.
indexType Der Name des Algorithmus, der für die Anordnung der Daten in dem betreffenden Feld verwendet wird. Anwendbare Algorithmen finden Sie unter In-memory Index und On-disk Index.
metricType Die für den Index zu verwendende Abstandsmetrik. Mögliche Werte sind IP, L2, COSINE, JACCARD, HAMMING.
extraParams Zusätzliche Index-Parameter. Einzelheiten finden Sie unter In-Memory-Index und On-Disk-Index.
Parameter Beschreibung
collection_name Der Name einer vorhandenen Sammlung.
field_name Der Name des Feldes, in dem ein Index erstellt werden soll.
index_type Der Typ des zu erstellenden Indexes.
metric_type Der metrische Typ, der zur Messung des Vektorabstands verwendet wird.
index_name Der Name des zu erstellenden Indexes.
params Andere indexspezifische Parameter.

Hinweise

Derzeit können Sie nur eine Indexdatei für jedes Feld in einer Sammlung erstellen.

Indexdetails prüfen

Nachdem Sie einen Index erstellt haben, können Sie seine Details überprüfen.

Um die Indexdetails zu prüfen, verwenden Sie list_indexes() um die Indexnamen aufzulisten und describe_index() um die Indexdetails zu erhalten.

Um die Indexdetails zu prüfen, verwenden Sie describeIndex() um die Indexdetails zu erhalten.

Um die Indexdetails zu prüfen, verwenden Sie describeIndex() um die Indexdetails zu erhalten.

# 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"
//   }
// ]
// 

Sie können die Indexdatei überprüfen, die für ein bestimmtes Feld erstellt wurde, und die Statistik über die Anzahl der mit dieser Indexdatei indizierten Zeilen sammeln.

Einen Index löschen

Sie können einen Index einfach löschen, wenn er nicht mehr benötigt wird.

Bevor Sie einen Index löschen, vergewissern Sie sich, dass er zuvor freigegeben wurde.

Um einen Index zu löschen, verwenden Sie drop_index().

Um einen Index zu löschen, verwenden Sie dropIndex().

Um einen Index zu löschen, verwenden Sie 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
// 

Übersetzt vonDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?