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.
| Unterfeldpfad | Typ | Zweck des Index |
|---|---|---|
chunks[emb_list_vector] | FLOAT_VECTOR | Suche in der „EmbeddingList“ mit „ MAX_SIM* “-Metriken. |
chunks[emb] | FLOAT_VECTOR | Suche auf Elementebene mit regulären Vektormetriken. |
chunks[section] | VARCHAR | Kategorische Filterung. |
chunks[quality_score] | FLOAT | Numerische Filterung und Prädikate im Bereichsstil. |
chunks[has_code] | BOOL | Boolesche 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 Filterziel | Zielpfad | Was Sie auswählen sollten |
|---|---|---|
| Suche in der EmbeddingList | chunks[emb_list_vector] | Eine „ MAX_SIM* “-Metrikfamilie. |
| Vektorsuche auf Elementebene | chunks[emb] | Eine reguläre Vektormetrikfamilie, wie z. B. „ COSINE “, „ IP “ oder „ L2 “. |
| Nach Zeichenfolge oder Kategorie filtern | chunks[section] | Ein von Ihrem Ziel unterstützter skalarer Index. |
| Nach numerischem Bereich filtern | chunks[quality_score], chunks[page] | Ein von Ihrem Ziel unterstützter skalarer Index. |
| Nach boolescher Wert filtern | chunks[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.
„EmbeddingList“-Suche
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-Unterfelds | Indextyp | Metriktyp |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | IVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANN | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
BINARY_VECTOR | HNSW | MAX_SIM_HAMMING, MAX_SIM_JACCARD |
Suche auf Elementebene
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-Teilfelds | Indextyp | Metriktyp |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | FLAT, 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, DISKANN | L2, IP, COSINE |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | L2, IP, COSINE |
BINARY_VECTOR | HNSW | HAMMING, JACCARD |
BINARY_VECTOR | BIN_FLAT | HAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD |
BINARY_VECTOR | BIN_IVF_FLAT | HAMMING, 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
| Regel | Erlä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
Um eine „EmbeddingList“-Suche auf Entitätsebene oder eine Vektorsuche auf Elementebene durchzuführen, lesen Sie „Grundlegende Vektorsuche mit StructArray“.
Informationen zum Filtern von skalaren StructArray-Unterfeldern während der Suche finden Sie unter „Gefilterte Suche mit StructArray“.
Informationen zu Index- und Metrikbeschränkungen finden Sie unter „StructArray-Beschränkungen“.