Einfache Vektorsuche mit StructArray
Auf dieser Seite können Sie eine Vektorsuche in Vektor-Unterfeldern innerhalb eines StructArray-Feldes durchführen. StructArray unterstützt zwei grundlegende Vektorsuchmodi: die EmbeddingList-Suche, bei der eine in jeder Entität gespeicherte Einbettungsliste ausgewertet wird, und die Suche auf Elementebene, bei der jedes Struct-Element unabhängig durchsucht wird.
Diese Seite verwendet die Sammlung „ tech_articles “ aus dem Abschnitt „Erstellen eines StructArray-Feldes“. Die Sammlung enthält ein StructArray-Feld namens „ chunks “. Jeder Chunk enthält Text, skalare Metadaten, ein Vektor-Unterfeld namens „ emb_list_vector “ mit einem Index für die EmbeddingList-Suche sowie ein Vektor-Unterfeld namens „ emb “ mit einem Index für die Suche auf Elementebene.
Bevor Sie beginnen
Stellen Sie sicher, dass das Sammlungsschema, die Daten und die Indizes bereits vorbereitet sind.
| Voraussetzung | Wo dies vorzubereiten ist |
|---|---|
Erstellen Sie ein StructArray-Feld, z. B. „ chunks “. | Erstellen eines StructArray-Feldes |
Fügen Sie Entitäten ein, deren Feld „ chunks “ Struct-Objekte enthält. | Daten in „StructArray“-Felder einfügen |
Erstellen Sie einen „ MAX_SIM* “-Index auf „ chunks[emb_list_vector] “ für die Suche in „EmbeddingList“. | StructArray-Felder indizieren |
Erstellen Sie einen regulären vektormetrischen Index auf „ chunks[emb] “ für die Suche auf Elementebene. | StructArray-Felder indizieren |
Warnung
Ein Vektorfeld oder Vektor-Teilfeld akzeptiert nur einen Index. Wenn Sie sowohl die „EmbeddingList“-Suche als auch die Suche auf Elementebene benötigen, erstellen Sie zwei separate Vektor-Teilfelder. Auf dieser Seite wird „ chunks[emb_list_vector] “ für die „EmbeddingList“-Suche indiziert und „ chunks[emb] “ für die Suche auf Elementebene.
Wählen Sie einen Suchmodus
| Aspekt | „EmbeddingList“-Suche | Suche auf Elementebene |
|---|---|---|
| Ziel-Unterfeld | chunks[emb_list_vector] | chunks[emb] |
| Abfragedaten | Eine Einbettungsliste, die einen oder mehrere Vektoren enthält. | Ein regulärer Vektor. |
| Metrikfamilie | MAX_SIM*, wie z. B. MAX_SIM_COSINE. | Reguläre Vektormetriken, wie z. B. „ COSINE “, „ IP “ oder „ L2 “. |
| Was ein Treffer darstellt | Eine übereinstimmende Entität, deren StructArray-Vektor-Unterfeld der Einbettungsliste der Abfrage ähnelt. | Ein übereinstimmendes Struct-Element innerhalb des StructArray-Feldes. |
| Granularität der Ergebnisse | Entitäts-Ebene. | Struct-Element-Ebene. |
| Offset | Nicht zutreffend. | Gibt die Position des gefundenen Struct-Elements (ab Null) bei der Rückgabe an. |
| Typische Verwendung | ColBERT, ColPali und andere Retrieval-Muster mit später Interaktion. | Retrieval auf Chunk-, Passage-, Clip-, Patch- oder Faktenebene. |
EmbeddingList-Suche ausführen
Verwenden Sie die „EmbeddingList“-Suche, wenn die Abfrage selbst mehrere Vektoren enthält und das Ziel-StructArray-Vektor-Unterfeld mit einer „ MAX_SIM* “-Metrik indiziert ist. Das Ergebnis ist eine Übereinstimmung auf Entitätsebene.
from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])
results = client.search(
collection_name="tech_articles",
data=[query],
anns_field="chunks[emb_list_vector]",
limit=3,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)
for hits in results:
for hit in hits:
print(hit["id"], hit["distance"], hit["entity"])
In diesem Suchmodus steuert „ limit “, wie viele Entitäten für jede Abfrage zurückgegeben werden. Die Ausgabe kann StructArray-Unterfelder enthalten, aber der Treffer selbst repräsentiert die übereinstimmende übergeordnete Entität und nicht ein bestimmtes Struct-Element.
Eine vollständige Anleitung im Stil von ColBERT oder ColPali finden Sie unter „Suche mit Einbettungslisten“. Diese Seite behandelt lediglich das grundlegende Suchverhalten von StructArray.
Suche auf Elementebene durchführen
Verwenden Sie die Suche auf Elementebene, wenn jedes Struct-Element unabhängig an der Vektorsuche teilnehmen soll. Die Abfrage ist ein regulärer Vektor, und das Zielvektor-Unterfeld muss mit einer regulären Vektormetrik indiziert sein.
query_vector = [0.19, 0.24, 0.30, 0.37]
results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[page]",
"chunks[quality_score]",
],
)
for hits in results:
for hit in hits:
print(
"doc_id:", hit["id"],
"distance:", hit["distance"],
"offset:", hit.get("offset"),
"entity:", hit["entity"],
)
Bei der Suche auf Elementebene repräsentiert jeder Treffer ein übereinstimmendes „Struct“-Element. Der Wert „ offset “ ist die nullbasierte Position dieses Elements im „StructArray“-Feld. Dieselbe Entität kann mehrmals vorkommen, wenn mehr als ein „Struct“-Element mit der Abfrage übereinstimmt. Der Wert „ limit “ bezieht sich auf Elementtreffer, nicht auf eindeutige übergeordnete Entitäten.
Ergebnisse interpretieren
| Ergebniselement | „EmbeddingList“-Suche | Suche auf Elementebene |
|---|---|---|
id | Primärschlüssel der übereinstimmenden Entität. | Primärschlüssel der Entität, die das übereinstimmende Struct-Element enthält. |
distance oder Wert | Score oder Abstand zwischen der Abfrage-Einbettungsliste und der gespeicherten Einbettungsliste. | Score oder Abstand zwischen dem Abfragevektor und dem Vektor des übereinstimmenden Struct-Elements. |
offset | Nicht zutreffend. | Nullbasierte Position des übereinstimmenden Struct-Elements bei der Rückgabe. |
| Wiederholte Primärschlüssel | Bei einer einzelnen Abfrage nicht zu erwarten, da die Ergebnisse auf Entitätsebene vorliegen. | Möglich, da mehrere Struct-Elemente in derselben Entität übereinstimmen können. |
| Angeforderte StructArray-Ausgabefelder | Werden von der übereinstimmenden Entität zurückgegeben. | Werden mit der von der Ziel-API und dem SDK unterstützten Trefferform auf Elementebene zurückgegeben. |
Häufige Fehler
Verwendung von „
chunks.emb“ anstelle der erforderlichen Syntax für den Unterfeldpfad „chunks[emb]“.Verwendung einer „EmbeddingList“-Abfrage für ein Vektor-Unterfeld, das mit einer regulären Vektormetrik indiziert ist.
Verwendung einer regulären Vektorabfrage für ein Vektor-Unterfeld, das mit einer „
MAX_SIM*“-Metrik indiziert ist.Die Erwartung, dass die Suche auf Elementebene mit „
limit“ ebenso viele eindeutige übergeordnete Entitäten zurückgibt. Es werden Elementtreffer zurückgegeben.Die Erwartung, dass die „EmbeddingList“-Suche einen bestimmten Element-Offset zurückgibt. Es werden Übereinstimmungen auf Entitätsebene zurückgegeben.
Wiederverwendung eines Vektor-Teilfelds für beide Suchmodi. Verwenden Sie separate Vektor-Teilfelder, da jedes Vektor-Teilfeld nur einen Index akzeptiert.
Nächste Schritte
Um die Suche auf Elementebene durch skalare Bedingungen einzuschränken, lesen Sie „Gefilterte Suche mit StructArray“.
Informationen zur Suche anhand von Score- oder Abstandsgrenzen finden Sie unter „Bereichssuche mit StructArray“.
Um nach einer Suche auf Elementebene höchstens ein Ergebnis pro übergeordneter Entität zurückzugeben, lesen Sie „Gruppierte Suche mit StructArray“.
Um die StructArray-Suche mit anderen Vektorsuchen zu kombinieren, lesen Sie „Hybride Suche mit StructArray“.
Informationen zu unterstützten Datentypen, Metriken, Filtern und versionsspezifischen Beschränkungen finden Sie unter „StructArray-Beschränkungen“.