Hybridsuche mit StructArray

Auf dieser Seite können Sie die StructArray-Vektorsuche mit anderen Vektorsuchen in einer hybriden Suchanfrage kombinieren. Die StructArray-Hybridsuche kann je nach den kombinierten „ AnnSearchRequest “-Objekten entweder Ergebnisse auf Entitätsebene oder auf Elementebene liefern.

Diese Seite verwendet die „ tech_articles “-Sammlung aus dem Abschnitt „Erstellen eines StructArray-Feldes“. Die Sammlung verfügt über ein Vektorfeld auf oberster Ebene namens „ title_vector “ und ein StructArray-Feld namens „ chunks “. Das Unterfeld „ chunks[emb_list_vector] “ ist für die EmbeddingList-Suche indiziert, und „ chunks[emb] “ ist für die Suche auf Elementebene indiziert.

Anwendung der hybriden Suche auf „StructArray“

AnnSearchRequest KombinationEndgültiger KandidatenbereichVerhalten des Ergebnisseselement_scope
Vektorfeld auf Sammlungsebene + StructArray-Unterfeld „EmbeddingList“EntitätsebeneEndgültige Kandidaten werden über den Primärschlüssel indiziert.Nicht verwenden.
Vektorfeld auf Sammlungsebene + Unterfeld auf Elementebene von StructArrayEntitätsebeneTreffer auf Elementebene werden vor der hybriden Neureihung zu Kandidaten auf Entitätsebene zusammengefasst.Optionale Zusammenfassungskonfiguration auf der StructArray-Elementebene AnnSearchRequest.
Mehrere Unterfelder auf Elementebene unter demselben StructArray-FeldElementebeneEndgültige Kandidaten werden anhand des Primärschlüssels sowie des Struct-Element-Offsets indiziert.Nicht verwenden.
Unterfelder auf Elementebene unter verschiedenen StructArray-FeldernEntitätsebeneElement-Offsets haben keine gemeinsame Identität, daher wird jede StructArray- AnnSearchRequest auf Elementebene vor der Neuanordnung zusammengefasst.Optionale Konfiguration zum Zusammenklappen für jedes „ AnnSearchRequest “ auf StructArray-Elementebene.

Warnung

Verwenden Sie „ element_scope “ ausschließlich zur Konfiguration der Zusammenfassung für StructArray-Objekte auf Elementebene ( AnnSearchRequest ) bei einer hybriden Suche auf Elementebene mit nicht identischen Strukturen. Verwenden Sie diese Option nicht für EmbeddingList-Anfragen, Vektor-Anfragen auf Sammlungsebene oder eine hybride Suche auf Elementebene mit identischen StructArray-Elementen.

Bevor Sie beginnen

Bereiten Sie die Sammlung, die Daten und die Indizes vor, bevor Sie die hybride Suche ausführen.

VoraussetzungDetails
StructArray-FeldDie Sammlung enthält ein StructArray-Feld wie beispielsweise „ chunks “.
Vektor-UnterfelderVerwenden Sie separate Vektor-Unterfelder für die Suche in der „EmbeddingList“ und die Suche auf Elementebene.
Indizeschunks[emb_list_vector] verwendet eine „ MAX_SIM* “-Metrik. „ chunks[emb] “ verwendet eine reguläre Vektormetrik wie beispielsweise „ COSINE “, „ IP “ oder „ L2 “.
RerankerWählen Sie einen hybriden Reranker wie RRFRanker oder einen anderen von Ihrer Anwendung unterstützten Reranker.

Informationen zur Indexeinrichtung finden Sie unter „Index StructArray-Felder“.

Führen Sie eine Hybrid-Suche mit einer „EmbeddingList“-Anfrage durch

Die „EmbeddingList“-Suche in einem „StructArray“-Vektor-Unterfeld erfolgt bei der hybriden Suche auf Entitätsebene. Sie verhält sich wie eine Vektorsuche auf Entitätsebene und gibt keinen Offset für ein übereinstimmendes „Struct“-Element zurück.

from pymilvus import AnnSearchRequest, MilvusClient, RRFRanker
from pymilvus.client.embedding_list import EmbeddingList

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

query_vector = [0.19, 0.24, 0.30, 0.37]

query_list = EmbeddingList()
query_list.add([0.12, 0.21, 0.32, 0.44])
query_list.add([0.18, 0.23, 0.29, 0.36])

title_req = AnnSearchRequest(
    data=[query_vector],
    anns_field="title_vector",
    limit=10,
)

chunk_list_req = AnnSearchRequest(
    data=[query_list],
    anns_field="chunks[emb_list_vector]",
    limit=10,
)

results = client.hybrid_search(
    collection_name="tech_articles",
    reqs=[title_req, chunk_list_req],
    ranker=RRFRanker(),
    limit=5,
    output_fields=[
        "doc_id",
        "title",
        "category",
        "chunks[text]",
        "chunks[section]",
    ],
)

In diesem Beispiel liefern beide „ AnnSearchRequest “-Objekte Kandidaten auf Entitätsebene. Das Endergebnis wird anhand des Primärschlüssels der übergeordneten Entität indiziert. Fügen Sie der „EmbeddingList“-Anfrage keine „ element_scope “-Angabe hinzu.

Wenn alle „ AnnSearchRequest “-Objekte auf Vektor-Unterfelder auf Elementebene unter demselben „StructArray“-Feld abzielen, kann die hybride Suche durch eine Neugewichtung Kandidaten auf Elementebene beibehalten. Dies ist der einzige hybride „StructArray“-Modus, bei dem die Endergebnisse auf Elementebene bleiben.

Das folgende Beispiel geht davon aus, dass das „ chunks “-StructArray-Feld zwei Vektor-Unterfelder auf Elementebene enthält, „ chunks[emb] “ und „ chunks[code_emb] “, und dass beide reguläre Vektormetriken verwenden.

index_chunk_req = AnnSearchRequest(
    data=[query_vector],
    anns_field="chunks[emb]",
    limit=10,
    expr='element_filter(chunks, $[section] == "index")',
)

code_chunk_req = AnnSearchRequest(
    data=[code_query_vector],
    anns_field="chunks[code_emb]",
    limit=10,
    expr='element_filter(chunks, $[has_code] == true)',
)

results = client.hybrid_search(
    collection_name="tech_articles",
    reqs=[index_chunk_req, code_chunk_req],
    ranker=RRFRanker(),
    limit=5,
    output_fields=[
        "doc_id",
        "title",
        "chunks[text]",
        "chunks[section]",
        "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"],
        )

Beide „ AnnSearchRequest “-Objekte durchsuchen die Vektor-Unterfelder unter „ chunks “. Derselbe nullbasierte Offset bezieht sich auf dasselbe Struct-Element, sodass der Hybrid-Reranker Elementkandidaten direkt bewerten kann. Setzen Sie „ element_scope “ in diesem Modus nicht, da keine Zusammenfassung auf Entitätsebene durchgeführt wird.

Wenn eine hybride Suche ein „ AnnSearchRequest “ auf StructArray-Ebene mit einer Vektorabfrage auf Sammlungsebene, einer „EmbeddingList“-Abfrage oder einer Abfrage auf Elementebene unter einem anderen StructArray-Feld kombiniert, liegt der endgültige Kandidatenbereich auf Entitätsebene. In diesem Fall wird jedes „ AnnSearchRequest “ auf StructArray-Ebene vor der hybriden Neureihung auf Kandidaten auf Entitätsebene zusammengefasst.

Verwenden Sie „ element_scope “ innerhalb des „ params “ des StructArray-Element-Level-„ AnnSearchRequest “, wenn Sie steuern möchten, wie mehrere übereinstimmende Elemente derselben Entität zusammengefasst werden.

title_req = AnnSearchRequest(
    data=[query_vector],
    anns_field="title_vector",
    limit=10,
)

chunk_req = AnnSearchRequest(
    data=[query_vector],
    anns_field="chunks[emb]",
    param={
        "params": {
            "element_scope": {
                "collapse": {
                    "strategy": "topk_sum",
                    "topk": 3,
                },
            },
        },
    },
    limit=30,
    expr='element_filter(chunks, $[quality_score] > 0.8)',
)

results = client.hybrid_search(
    collection_name="tech_articles",
    reqs=[title_req, chunk_req],
    ranker=RRFRanker(),
    limit=5,
    output_fields=[
        "doc_id",
        "title",
        "category",
        "chunks[text]",
        "chunks[section]",
        "chunks[quality_score]",
    ],
)

In diesem Beispiel ist „ title_req “ auf Entitätsebene, sodass das endgültige hybride Ergebnis ebenfalls auf Entitätsebene liegt. Die „ chunk_req “-Anfrage gibt zunächst Elementtreffer aus „ chunks[emb] “ zurück und fasst dann die zurückgegebenen Elemente derselben Entität zusammen, indem sie die drei besten Elementwerte addiert. Wird „ element_scope “ weggelassen, obwohl eine Zusammenfassung auf Entitätsebene erforderlich ist, wird standardmäßig die Zusammenfassungsstrategie „ max “ verwendet.

Wählen Sie eine Zusammenfassungsstrategie

StrategieVerhaltentopkMetrik-Anforderung
maxBeibehaltung der besten Wertung des zurückgegebenen Elements für die Entität.Nicht zulässig.Jede unterstützte reguläre Vektormetrik.
sumSumme aller zurückgegebenen Elementwerte für die Entität.Nicht zulässig.Nur Metriken mit positiver Korrelation, wie z. B. „ IP “ oder „ COSINE “.
avgDurchschnitt aller zurückgegebenen Elementwerte für die Entität.Nicht zulässig.Jede unterstützte reguläre Vektormetrik.
topk_sumSumme der besten „ K “-Bewertungen der zurückgegebenen Elemente für die Entität.Erforderlich und muss positiv sein.Nur Metriken mit positiver Korrelation, wie z. B. „ IP “ oder „ COSINE “.
topk_avgBerechne den Durchschnitt der besten von „ K “ zurückgegebenen Elementbewertungen für die Entität.Erforderlich und muss positiv sein.Jede unterstützte reguläre Vektormetrik.

„Collapse“ verwendet ausschließlich die Elementtreffer, die von der „ AnnSearchRequest “ auf StructArray-Ebene zurückgegeben werden. Es werden nach der ANN-Suche nicht alle Struct-Elemente in der Entität durchsucht. Stellen Sie den Wert für „ limit “ in der Anfrage hoch genug ein, um die Elemente bereitzustellen, die Sie für „Collapse“ nutzen möchten.

Filter, Bereichssuche und Gruppierung hinzufügen

Sie können „ element_filter “ an eine „StructArray“-Elementebene-„ AnnSearchRequest “ anhängen, wenn skalare Bedingungen auf dieselben „Struct“-Elemente angewendet werden sollen, die an der Vektorsuche teilnehmen. Sie können auch eine „ filter “ auf oberster Ebene für „ hybrid_search() “ verwenden, um Bedingungen für übergeordnete Entitäten festzulegen.

Vektorfelder auf StructArray-Ebene unterstützen die Bereichssuche bei der hybriden Suche. Fügen Sie „ radius “ und optional „ range_filter “ zur „ AnnSearchRequest “ auf Elementebene hinzu. StructArray-Anfragen auf „EmbeddingList“-Ebene unterstützen keine Bereichssuche.

Die hybride Gruppierung auf Elementebene wird nur unterstützt, wenn alle „ AnnSearchRequest “-Objekte auf Vektorfelder auf Elementebene unter demselben „StructArray“-Feld abzielen und „ group_by_field “ der Primärschlüssel sein muss. Die hybride Gruppierung wird nicht unterstützt, wenn die Abfrage Vektorfelder auf Sammlungsebene, verschiedene „StructArray“-Felder oder Abfragen auf „EmbeddingList“-Ebene mischt. Kombinieren Sie die Bereichssuche nicht mit einer Gruppierung.

Hybride Ergebnisse interpretieren

Endgültiger KandidatenbereichErgebnisschlüsselOffset-VerhaltenWann dies auftritt
EntitätsebenePrimärschlüssel.Kein Element-Offset im Endergebnis.Die Hybridanfrage enthält ein Vektorfeld auf Sammlungsebene, eine „EmbeddingList“-Anfrage oder Anfragen auf Elementebene unter verschiedenen „StructArray“-Feldern.
Ebene der ElementePrimärschlüssel plus übergeordnetes StructArray-Feld plus Element-Offset.Der ausgewählte Element-Offset kann zurückgegeben werden, wenn er von der API oder dem SDK bereitgestellt wird.Alle „ AnnSearchRequest “-Objekte befinden sich auf Elementebene und unter demselben „StructArray“-Feld.

Einschränkungen

  • Verwenden Sie „ element_scope “ ausschließlich für „ AnnSearchRequest “-Objekte auf StructArray-Ebene, die bei der hybriden Suche auf Kandidaten auf Entitätsebene reduziert werden müssen.

  • Verwenden Sie „ element_scope “ nicht für „EmbeddingList“-Anfragen, Vektor-Anfragen auf Sammlungsebene oder die hybride Suche auf Elementebene innerhalb desselben „StructArray“.

  • sum Die Zusammenfassungsstrategien „ topk_sum “ und „ “ erfordern Metriken mit positiver Korrelation, wie beispielsweise „ IP “ oder „ COSINE “. Verwenden Sie diese nicht in Verbindung mit „ L2 “.

  • topk_sum und „ topk_avg “ erfordern einen positiven Wert für „ topk “. Andere Zusammenfassungsstrategien dürfen „ topk “ nicht enthalten.

  • StructArray-Anfragen auf „EmbeddingList“-Ebene unterstützen weder die Bereichssuche noch „group-by“.

  • Hybride Gruppierungen werden nur für hybride Suchvorgänge auf Elementebene desselben StructArray und ausschließlich nach Primärschlüssel unterstützt.

  • Kombinieren Sie die Bereichssuche nicht mit „group-by“.

Häufige Fehler

  • Hinzufügen von „ element_scope “ zu einer hybriden Abfrage auf StructArray-Ebene mit identischen Elementen. Diese Abfrage bleibt auf Elementebene und führt keine Zusammenfassung auf Entitätsebene durch.

  • Hinzufügen von „ element_scope “ zu „ chunks[emb_list_vector] “. Die „EmbeddingList“-Suche erfolgt bereits auf Entitätsebene.

  • Annahme, dass zwei StructArray-Felder Element-Offsets gemeinsam nutzen. „Offset 3 “ in „ chunks “ und „Offset 3 “ in einem anderen StructArray-Feld beziehen sich auf unterschiedliche Elemente, sodass die Hybridanfrage auf Entitätsebene erfolgt.

  • Verwenden Sie „ topk_sum “ mit „ L2 “. Verwenden Sie „ max “, „ avg “ oder „ topk_avg “ für negative Abstandsmetriken.

  • Es wird erwartet, dass hybride Ergebnisse auf Entitätsebene den ausgewählten Struct-Element-Offset nach dem Zusammenklappen enthalten.

Nächste Schritte

  1. Um mehr über die beiden grundlegenden Vektorsuchmodi von StructArray zu erfahren, lesen Sie „Grundlegende Vektorsuche mit StructArray“.

  2. Um der hybriden Suche skalare Filter hinzuzufügen, lesen Sie „Gefilterte Suche mit StructArray“.

  3. Informationen zur Verwendung von Score- oder Distanzgrenzen bei der hybriden Suche finden Sie unter „Bereichssuche mit StructArray“.

  4. Um hybride Ergebnisse auf Elementebene nach übergeordneter Entität zu gruppieren, lesen Sie „Gruppierte Suche mit StructArray“.

  5. Um die Suchgrenzen von StructArray zu überprüfen, lesen Sie „StructArray-Grenzen“.