Bereichssuche mit StructArray

Verwenden Sie diese Seite, um eine Bereichssuche in den Vektor-Unterfeldern eines StructArray durchzuführen. Die Bereichssuche liefert Vektor-Treffer, deren Wert oder Abstand innerhalb eines festgelegten Bereichs liegt. Bei StructArray-Feldern verwenden Sie die Bereichssuche in Verbindung mit der Vektorsuche 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 “. Das Vektor-Unterfeld „ chunks[emb] “ ist für die Suche auf Elementebene mit einer regulären Vektormetrik wie „ COSINE “, „ IP “ oder „ L2 “ indiziert.

Anwendung der Bereichssuche auf StructArray

SuchmodusVerhalten der BereichssucheGranularität der Ergebnisse
Suche in „EmbeddingList“Nicht unterstützt.Nicht zutreffend.
Suche auf ElementebeneVerwenden Sie eine reguläre Vektorabfrage mit „ radius “ und optional „ range_filter “.Struktur-Ebene.
Hybride SucheWird unterstützt, wenn die StructArray-Anfrage auf ein Vektorfeld auf Elementebene abzielt. Anfragen auf EmbeddingList-Ebene unterstützen keine Bereichssuche.Teilsuche auf Elementebene, gefolgt von einer hybriden Neureihung.

Wenn Sie nur die nächstgelegenen Struct-Elemente benötigen, beginnen Sie mit der einfachen Vektorsuche mit StructArray. Verwenden Sie die Bereichssuche, wenn das Ergebnis eine bestimmte Punktzahl- oder Abstandsgrenze erfüllen muss, anstatt nur ein Top-K-Ranking.

Bevor Sie beginnen

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

VoraussetzungDetails
StructArray-FeldDie Sammlung enthält ein StructArray-Feld, z. B. „ chunks “.
Vektor-Unterfeld auf ElementebeneDas Ziel-Vektor-Unterfeld lautet „ chunks[emb] “, nicht „ chunks[emb_list_vector] “.
IndexmetrikDas Vektor-Unterfeld wird mit einer regulären Vektormetrik indiziert, wie z. B. COSINE, IP oder L2.
AbfragedatenDie Abfrage ist ein regulärer Vektor, kein „ EmbeddingList “.

Informationen zur Indexeinrichtung finden Sie unter „Indexierung von StructArray-Feldern“.

Verwenden Sie „radius“ und „range_filter“

Legen Sie „ radius “ fest, um die Suchgrenze zu definieren. Legen Sie „ range_filter “ fest, wenn Sie zusätzlich eine innere Grenze benötigen. Die Ausrichtung hängt davon ab, ob eine geringere Entfernung oder ein höherer Ähnlichkeitswert bevorzugt wird.

MetriktypIst ein höherer Wert besser?Bereichsbedingung bei Verwendung von „ range_filter
L2Nein. Ein geringerer Abstand ist besser.range_filter <= distance < radius
IP, COSINEJa. Ein höherer Wert ist besser.radius < distance <= range_filter

Wenn nur „ radius “ festgelegt ist, liefert die Bereichssuche Treffer, die die äußere Grenze der Metrik erfüllen. Wählen Sie Werte entsprechend der Wert- oder Abstandsskala Ihrer Einbettungen aus.

Das folgende Beispiel sucht nach einzelnen Chunks, deren „ chunks[emb] “-Vektoren dem Abfragevektor ausreichend ähnlich sind. Jeder Treffer entspricht einem übereinstimmenden Struct-Element.

from pymilvus import MilvusClient

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

query_vector = [0.19, 0.24, 0.30, 0.37]

results = client.search(
    collection_name="tech_articles",
    data=[query_vector],
    anns_field="chunks[emb]",
    search_params={
        "params": {
            "radius": 0.80,
            "range_filter": 0.95,
        },
    },
    limit=10,
    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"],
        )

In diesem Beispiel ist „ COSINE “ eine Ähnlichkeitsmetrik, sodass der Ergebnisbereich größer als radius und kleiner oder gleich range_filter ist. Der Wert „ offset “ identifiziert das übereinstimmende Struct-Element im Array „ chunks “, wenn es zurückgegeben wird.

Skalarfilter hinzufügen

Sie können die Bereichssuche auf Elementebene mit der skalaren Filterung von `StructArray` kombinieren. Verwenden Sie ein Prädikat der obersten Ebene für Felder der übergeordneten Entität und nutzen Sie ` element_filter `, um einzuschränken, welche `Struct`-Elemente an der Vektorbereichssuche teilnehmen.

filter_expr = (
    'category == "search" && '
    'element_filter(chunks, '
    '$[section] == "index" && '
    '$[quality_score] > 0.9)'
)

results = client.search(
    collection_name="tech_articles",
    data=[query_vector],
    anns_field="chunks[emb]",
    search_params={
        "params": {
            "radius": 0.80,
            "range_filter": 0.95,
        },
    },
    filter=filter_expr,
    limit=10,
    output_fields=[
        "doc_id",
        "title",
        "category",
        "chunks[text]",
        "chunks[section]",
        "chunks[quality_score]",
    ],
)

Das Prädikat auf oberster Ebene wählt Kandidatenentitäten aus. Das Prädikat „ element_filter “ beschränkt die Vektorbereichssuche auf übereinstimmende Struct-Elemente. Weitere Filterbeispiele finden Sie unter „Gefilterte Suche mit StructArray“.

Vektorfelder auf StructArray-Ebene unterstützen die Bereichssuche in der hybriden Suche. Fügen Sie „ radius “ und optional „ range_filter “ zur „ AnnSearchRequest “ hinzu, die auf das Vektorfeld auf StructArray-Ebene abzielt.

from pymilvus import AnnSearchRequest, RRFRanker

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

chunk_req = AnnSearchRequest(
    data=[query_vector],
    anns_field="chunks[emb]",
    param={
        "params": {
            "radius": 0.80,
            "range_filter": 0.95,
        },
    },
    limit=10,
    expr='element_filter(chunks, $[section] == "index")',
)

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

In diesem Beispiel verwendet nur die Unteranfrage „ chunks[emb] “ Parameter für die Bereichssuche. Die StructArray-Anfrage folgt weiterhin der Semantik auf Elementebene: Die Bereichsgrenzen gelten für Treffer auf Struct-Ebene, bevor die hybride Suche die Ergebnisse kombiniert und neu ordnet.

Bereichsergebnisse interpretieren

ErgebniselementBedeutung
idPrimärschlüssel der Entität, die das übereinstimmende Struct-Element enthält.
distance oder ScoreDie Punktzahl oder der Abstand zwischen dem Abfragevektor und dem Vektor des übereinstimmenden Struct-Elements.
offsetNullbasierte Position des übereinstimmenden Struct-Elements im StructArray-Feld bei der Rückgabe.
Wiederholte PrimärschlüsselMöglich. Mehr als ein Struct-Element in derselben Entität kann in den angegebenen Bereich fallen.
limitGilt für Elementtreffer, nicht für eindeutige übergeordnete Entitäten.

Einschränkungen

  • Verwenden Sie keine „ EmbeddingList “-Abfrage oder die Metrik „ MAX_SIM* “ für die Bereichssuche in StructArray-Vektor-Unterfeldern. Die Suche auf „EmbeddingList“-Ebene unterstützt keine Bereichssuche.

  • Kombinieren Sie die Bereichssuche nicht mit einer Gruppierungssuche. Wenn Sie ein Ergebnis pro übergeordneter Entität benötigen, führen Sie eine Suche auf Elementebene ohne Bereichsparameter durch und verwenden Sie die Gruppierung, sofern diese unterstützt wird.

  • Die hybride Bereichssuche wird für Vektorfelder auf StructArray-Ebene unterstützt. Sie wird nicht für StructArray-Anfragen auf „EmbeddingList“-Ebene unterstützt.

Häufige Fehler

  • Durchführung einer Bereichssuche auf „ chunks[emb_list_vector] “, das für die Suche auf „EmbeddingList“-Ebene vorgesehen ist.

  • Verwendung von „ MAX_SIM_COSINE “ anstelle einer regulären Metrik wie „ COSINE “ für die Bereichssuche auf Elementebene.

  • Verwendung einer „ EmbeddingList “-Abfrage anstelle einer regulären Vektorabfrage.

  • Die Erwartung, dass die Ergebnisse der Bereichssuche pro übergeordneter Entität eindeutig sind. Die Bereichssuche liefert Treffer, die mit Struct-Elementen übereinstimmen.

  • Verwendung von „ chunks.emb “ anstelle der erforderlichen Unterfeld-Pfadsyntax „ chunks[emb] “.

Nächste Schritte

  1. Um die beiden grundlegenden StructArray-Vektorsuchmodi kennenzulernen, lesen Sie „Grundlegende Vektorsuche mit StructArray“.

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

  3. Um, sofern unterstützt, höchstens ein Ergebnis pro übergeordneter Entität zurückzugeben, lesen Sie „Gruppierte Suche mit StructArray“.

  4. Informationen zu versionsspezifischen Suchbeschränkungen finden Sie unter „StructArray-Beschränkungen“.