Pencarian Rentang dengan StructArray

Gunakan halaman ini untuk menjalankan pencarian rentang pada subbidang vektor StructArray. Pencarian rentang mengembalikan hasil vektor yang skor atau jaraknya berada dalam batas yang ditentukan. Untuk bidang StructArray, gunakan pencarian rentang dengan pencarian vektor tingkat elemen, di mana setiap elemen Struct dicari secara terpisah.

Halaman ini menggunakan koleksi " tech_articles " dari "Create a StructArray Field". Koleksi tersebut memiliki bidang StructArray bernama " chunks". Subbidang vektor " chunks[emb] " diindeks untuk pencarian tingkat elemen menggunakan metrik vektor reguler seperti " COSINE", " IP", atau " L2".

Bagaimana pencarian rentang diterapkan pada StructArray

Mode pencarianPerilaku pencarian rentangTingkat detail hasil
Pencarian EmbeddingListTidak didukung.Tidak berlaku.
Pencarian tingkat elemenGunakan kueri vektor biasa dengan ` radius ` dan, secara opsional, ` range_filter`.Tingkat elemen struktur.
Pencarian hibridaDidukung jika permintaan StructArray menargetkan bidang vektor tingkat elemen. Permintaan tingkat EmbeddingList tidak mendukung pencarian rentang.Pencarian sub-tingkat elemen, kemudian penataan ulang peringkat hibrida.

Jika Anda hanya memerlukan elemen Struct terdekat, mulailah dengan Pencarian Vektor Dasar dengan StructArray. Gunakan pencarian rentang ketika hasilnya harus memenuhi batas skor atau jarak, bukan hanya peringkat top-K.

Sebelum Anda mulai

Siapkan koleksi, data, dan indeks sebelum menjalankan pencarian rentang.

PersyaratanRincian
Bidang StructArrayKoleksi tersebut berisi bidang StructArray seperti chunks.
Subbidang vektor tingkat elemenSubbidang vektor yang dituju adalah chunks[emb], bukan chunks[emb_list_vector].
Metrik indeksSubbidang vektor diindeks dengan metrik vektor reguler, seperti COSINE, IP, atau L2.
Data kueriKueri berupa vektor biasa, bukan EmbeddingList.

Untuk pengaturan indeks, lihat Bidang StructArray Indeks.

Gunakan radius dan range_filter

Atur ` radius ` untuk menentukan batas pencarian. Atur ` range_filter ` jika Anda juga memerlukan batas bagian dalam. Arahnya bergantung pada apakah jarak yang lebih kecil lebih baik atau skor kesamaan yang lebih besar lebih baik.

Jenis metrikSkor yang lebih tinggi lebih baik?Kondisi rentang saat range_filter digunakan
L2Tidak. Jarak yang lebih kecil lebih baik.range_filter <= distance < radius
IP, COSINEYa. Skor yang lebih besar lebih baik.radius < distance <= range_filter

Ketika hanya " radius " yang ditetapkan, pencarian rentang akan mengembalikan hasil yang memenuhi batas luar metrik tersebut. Pilih nilai sesuai dengan skala skor atau jarak dari embedding Anda.

Contoh berikut mencari potongan-potongan individual yang vektor chunks[emb] -nya cukup mirip dengan vektor kueri. Setiap hasil yang cocok mewakili elemen Struct yang cocok.

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"],
        )

Dalam contoh ini, ` COSINE ` adalah metrik gaya kesamaan, sehingga rentang hasilnya lebih besar dari ` radius ` dan kurang dari atau sama dengan ` range_filter`. Nilai ` offset ` mengidentifikasi elemen Struct yang cocok dalam array ` chunks ` saat dikembalikan.

Tambahkan filter skalar

Anda dapat menggabungkan pencarian rentang tingkat elemen dengan penyaringan skalar StructArray. Gunakan predikat tingkat atas untuk bidang entitas induk, dan gunakan element_filter untuk membatasi elemen Struct mana yang ikut serta dalam pencarian rentang vektor.

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]",
    ],
)

Predikat tingkat atas memilih entitas kandidat. Predikat ` element_filter ` membatasi pencarian rentang vektor hanya pada elemen Struct yang cocok. Untuk contoh penyaringan lainnya, lihat Pencarian yang Disaring dengan StructArray.

Bidang vektor tingkat elemen StructArray mendukung pencarian rentang dalam pencarian hibrida. Tambahkan ` radius ` dan, secara opsional, ` range_filter ` ke ` AnnSearchRequest ` yang menargetkan bidang vektor tingkat elemen StructArray.

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]",
    ],
)

Dalam contoh ini, hanya sub-permintaan ` chunks[emb] ` yang menggunakan parameter pencarian rentang. Permintaan StructArray tetap mengikuti semantik tingkat elemen: batas rentang berlaku untuk hasil elemen Struct sebelum pencarian hibrida menggabungkan dan menyusun ulang hasil.

Menafsirkan hasil rentang

Item hasilArti
idKunci utama entitas yang berisi elemen Struct yang cocok.
distance atau skorSkor atau jarak antara vektor kueri dan vektor elemen Struct yang cocok.
offsetPosisi berbasis nol dari elemen Struct yang cocok di bidang StructArray saat dikembalikan.
Kunci utama yang berulangMungkin terjadi. Lebih dari satu elemen Struct dalam entitas yang sama dapat berada dalam rentang yang ditentukan.
limitBerlaku untuk kecocokan elemen, bukan entitas induk yang unik.

Batasan

  • Jangan gunakan kueri ` EmbeddingList ` atau metrik ` MAX_SIM* ` untuk pencarian rentang pada subbidang vektor StructArray. Pencarian tingkat EmbeddingList tidak mendukung pencarian rentang.

  • Jangan menggabungkan pencarian rentang dengan pencarian pengelompokan. Jika Anda memerlukan satu hasil per entitas induk, jalankan pencarian tingkat elemen tanpa parameter rentang dan gunakan pengelompokan jika didukung.

  • Pencarian rentang hibrida didukung untuk bidang vektor tingkat elemen StructArray. Fitur ini tidak didukung untuk permintaan StructArray tingkat EmbeddingList.

Kesalahan umum

  • Melakukan pencarian rentang terhadap chunks[emb_list_vector], yang dimaksudkan untuk pencarian EmbeddingList.

  • Menggunakan ` MAX_SIM_COSINE ` alih-alih metrik biasa seperti ` COSINE ` untuk pencarian rentang tingkat elemen.

  • Menggunakan kueri ` EmbeddingList ` alih-alih kueri vektor biasa.

  • Mengharapkan hasil pencarian rentang bersifat unik berdasarkan entitas induk. Pencarian rentang mengembalikan hasil yang cocok pada elemen Struct.

  • Menggunakan ` chunks.emb ` alih-alih sintaks jalur subfield yang diwajibkan ` chunks[emb]`.

Langkah selanjutnya

  1. Untuk mempelajari dua mode pencarian vektor StructArray dasar, baca Pencarian Vektor Dasar dengan StructArray.

  2. Untuk menambahkan filter skalar ke pencarian rentang, baca " Pencarian Terfilter dengan StructArray".

  3. Untuk mengembalikan paling banyak satu hasil per entitas induk di mana hal ini didukung, baca Pencarian Berkelompok dengan StructArray.

  4. Untuk memeriksa batasan pencarian berdasarkan versi, baca Batasan StructArray.