StructArray-Felder indizieren

Erstellen Sie Indizes für StructArray-Unterfelder, bevor Sie eine Vektorsuche durchführen oder die skalare Filterung beschleunigen. Bei einem StructArray-Feld ist das Indexziel ein Unterfeldpfad, z. B. chunks[emb_list_vector], chunks[emb] oder chunks[section].

Auf dieser Seite wird die Sammlung „ tech_articles “ aus dem Abschnitt „Erstellen eines StructArray-Feldes“ verwendet. Das StructArray-Feld „ chunks “ enthält skalare Unterfelder für die Filterung und Vektor-Unterfelder für die Suche.

Bevor Sie beginnen

Stellen Sie sicher, dass das Schema der Sammlung bereits das StructArray-Feld „ chunks “ enthält und Daten eingefügt wurden.

UnterfeldpfadTypZweck des Index
chunks[emb_list_vector]FLOAT_VECTORSuche in der „EmbeddingList“ mit „ MAX_SIM* “-Metriken.
chunks[emb]FLOAT_VECTORSuche auf Elementebene mit regulären Vektormetriken.
chunks[section]VARCHARKategorische Filterung.
chunks[quality_score]FLOATNumerische Filterung und Prädikate im Bereichsstil.
chunks[has_code]BOOLBoolesche Filterung.

Ein Vektorfeld oder Vektorunterfeld akzeptiert nur einen Index. Wenn Sie sowohl die EmbeddingList-Suche als auch die Suche auf Elementebene benötigen, erstellen Sie zwei separate Vektorunterfelder und indizieren Sie diese separat. Auf dieser Seite wird „ chunks[emb_list_vector] “ für die EmbeddingList-Suche indiziert und „ chunks[emb] “ für die Suche auf Elementebene.

Indizes auswählen

Verwenden Sie den Suchmodus, um die Vektormetrikfamilie auszuwählen.

Such- oder FilterzielZielpfadWas Sie auswählen sollten
Suche in der EmbeddingListchunks[emb_list_vector]Eine „ MAX_SIM* “-Metrikfamilie.
Vektorsuche auf Elementebenechunks[emb]Eine reguläre Vektormetrikfamilie, wie z. B. „ COSINE “, „ IP “ oder „ L2 “.
Nach Zeichenfolge oder Kategorie filternchunks[section]Ein von Ihrem Ziel unterstützter skalarer Index.
Nach numerischem Bereich filternchunks[quality_score], chunks[page]Ein von Ihrem Ziel unterstützter skalarer Index.
Nach boolescher Wert filternchunks[has_code]Ein von Ihrem Zielobjekt unterstützter Skalarindex.

Die „EmbeddingList“-Suche behandelt die Vektoren in einem StructArray-Vektor-Unterfeld als Einbettungsliste und gibt Ergebnisse auf Entitätsebene zurück. Die Suche auf Elementebene durchsucht jedes Struct-Element unabhängig und kann den Offset des übereinstimmenden Elements zurückgeben.

Vektorindizes erstellen

Im folgenden Beispiel werden zwei Vektorindizes erstellt. Der erste Index verwendet eine „ MAX_SIM* “-Metrik für die „EmbeddingList“-Suche. Der zweite Index verwendet eine reguläre Vektormetrik für die Suche auf Elementebene.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus",
)

index_params = client.prepare_index_params()

# Index for EmbeddingList search.
index_params.add_index(
    field_name="chunks[emb_list_vector]",
    index_name="chunks_emb_list_max_sim",
    index_type="HNSW",
    metric_type="MAX_SIM_COSINE",
    params={
        "M": 16,
        "efConstruction": 200,
    },
)

# Index for element-level search.
index_params.add_index(
    field_name="chunks[emb]",
    index_name="chunks_emb_cosine",
    index_type="HNSW",
    metric_type="COSINE",
    params={
        "M": 16,
        "efConstruction": 200,
    },
)

client.create_index(
    collection_name="tech_articles",
    index_params=index_params,
)

Warnung Erstellen Sie keinen „ MAX_SIM* “-Index und keinen regulären Vektor-Metrik-Index für dasselbe Vektor-Unterfeld. Wenn beide Suchmodi erforderlich sind, schreiben Sie die Vektoren in zwei separate Vektor-Unterfelder und erstellen Sie für jedes Unterfeld einen eigenen Index.

Erstellen von Skalarindizes

Erstellen Sie skalare Indizes für skalare StructArray-Unterfelder, wenn Sie diese in Filtern verwenden. Verwenden Sie dabei dieselbe „ structArray[subfield] “-Pfadsyntax.

index_params = client.prepare_index_params()

index_params.add_index(
    field_name="chunks[section]",
    index_name="chunks_section_inverted",
    index_type="INVERTED",
)

index_params.add_index(
    field_name="chunks[has_code]",
    index_name="chunks_has_code_inverted",
    index_type="INVERTED",
)

index_params.add_index(
    field_name="chunks[quality_score]",
    index_name="chunks_quality_score_sort",
    index_type="STL_SORT",
)

index_params.add_index(
    field_name="chunks[page]",
    index_name="chunks_page_sort",
    index_type="STL_SORT",
)

client.create_index(
    collection_name="tech_articles",
    index_params=index_params,
)

Skalare Indizes sind optional, aber nützlich, wenn skalare StructArray-Teilfelder häufig in Filtern vorkommen, wie z. B. „ element_filter(chunks, $[quality_score] > 0.9) “ oder „ MATCH_ANY(chunks, $[section] == "index") “.

Kompatibilität von Indexmetriken

Verwenden Sie die folgenden Tabellen, um einen Indextyp und einen Metriktyp für ein StructArray-Vektor-Unterfeld auszuwählen. Beginnen Sie mit dem Ziel und wählen Sie dann die Metrikfamilie nach Suchmodus aus.

Wählen Sie einen Milvus-Indextyp und einen Metriktyp aus den folgenden Kompatibilitätstabellen aus.

Die „EmbeddingList“-Suche verwendet „ MAX_SIM* “-Metriken. Sie behandelt die Vektoren in einem StructArray-Vektor-Unterfeld als Einbettungsliste und liefert Ergebnisse auf Entitätsebene.

Datentyp des Vektor-UnterfeldsIndextypMetriktyp
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTORIVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANNMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2
INT8_VECTORHNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2
BINARY_VECTORHNSWMAX_SIM_HAMMING, MAX_SIM_JACCARD

Die Suche auf Elementebene verwendet reguläre Vektormetriken. Sie durchsucht jedes Struct-Element unabhängig und kann den Offset des übereinstimmenden Elements zurückgeben.

Datentyp des Vektor-TeilfeldsIndextypMetriktyp
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTORFLAT, IVF_FLAT, IVF_FLAT_CC, IVF_SQ8, IVF_SQ_CC, IVF_PQ, SCANN, IVF_RABITQ, IVF_RABITQ_FASTSCAN, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANNL2, IP, COSINE
INT8_VECTORHNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQL2, IP, COSINE
BINARY_VECTORHNSWHAMMING, JACCARD
BINARY_VECTORBIN_FLATHAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD
BINARY_VECTORBIN_IVF_FLATHAMMING, JACCARD

Informationen zu versionsspezifischem Support und weiteren Einschränkungen finden Sie unter „StructArray-Einschränkungen“.

Indizes überprüfen

Beschreiben Sie nach dem Erstellen von Indizes die Sammlung oder listen Sie die Indizes auf, um sicherzustellen, dass die erwarteten Unterfeldpfade indiziert sind.

indexes = client.list_indexes(
    collection_name="tech_articles",
)

print(indexes)

Sie können auch einen bestimmten Index beschreiben, sofern Ihre SDK-Version APIs zur Indexbeschreibung bereitstellt.

index = client.describe_index(
    collection_name="tech_articles",
    index_name="chunks_emb_cosine",
)

print(index)

Indexregeln

RegelErläuterung
Verwenden Sie die Pfadsyntax für Unterfeldindizes.Indexieren Sie „ chunks[emb] “, nicht „ emb “ oder „ chunks.emb “.
Ein Vektor-Unterfeld akzeptiert einen Index.Verwenden Sie separate Vektor-Teilfelder, wenn Sie unterschiedliche Metrikfamilien benötigen.
Verwenden Sie „ MAX_SIM* “-Metriken für die EmbeddingList-Suche.Für Abfragen in der „EmbeddingList“ sind Daten aus einem Index erforderlich, der mit einer „ MAX_SIM* “-Metrik erstellt wurde.
Verwenden Sie reguläre Vektormetriken für die Suche auf Elementebene.Die Suche auf Elementebene verwendet reguläre Vektorabfragedaten und Metriken wie „ COSINE “, „ IP “ oder „ L2 “.
Indizieren Sie skalare Unterfelder, die in Filtern vorkommen.Verwenden Sie skalare Indizierungstypen, die von Ihrem Zielsystem unterstützt werden.
Beachten Sie die Beschränkungen für Vektorfelder.Die Gesamtzahl der Vektorfelder und Vektor-Teilfelder ist begrenzt. Lesen Sie den Abschnitt „StructArray-Grenzwerte“, bevor Sie viele Vektor-Teilfelder hinzufügen.

Häufige Fehler

  • Erstellen eines Index auf „ chunks.emb “ anstelle von „ chunks[emb] “.

  • Erstellen Sie nur einen „ MAX_SIM* “-Index und versuchen Sie dann, eine Suche auf Elementebene im selben Unterfeld durchzuführen.

  • Nur einen regulären Vektorindex erstellen und anschließend versuchen, eine „EmbeddingList“-Suche auf demselben Unterfeld durchzuführen.

  • Wiederverwendung eines Vektor-Unterfelds sowohl für „ MAX_SIM* “- als auch für reguläre Vektormetriken.

  • Das Versäumen, skalare Indizes für häufig verwendete „StructArray“-Filter zu erstellen.

  • Indizierung eines StructArray-Unterfelds, das im Struct-Schema nicht vorhanden ist.

Nächste Schritte

  1. Um eine „EmbeddingList“-Suche auf Entitätsebene oder eine Vektorsuche auf Elementebene durchzuführen, lesen Sie „Grundlegende Vektorsuche mit StructArray“.

  2. Informationen zum Filtern von skalaren StructArray-Unterfeldern während der Suche finden Sie unter „Gefilterte Suche mit StructArray“.

  3. Informationen zu Index- und Metrikbeschränkungen finden Sie unter „StructArray-Beschränkungen“.

Übersetzt vonDeepL

Verwaltetes Milvus kostenlos testen

Zilliz Cloud ist unkompliziert, basiert auf Milvus und ist 10-mal schneller.

Loslegen
Feedback

War diese Seite hilfreich?