Penyorot TeksCompatible with Milvus 2.6.8+
Penyorot di Milvus memberi keterangan pada istilah yang cocok di bidang teks dengan membungkusnya dengan tag yang dapat disesuaikan. Penyorotan membantu menjelaskan mengapa sebuah dokumen cocok, meningkatkan keterbacaan hasil, dan mendukung rendering yang kaya dalam aplikasi pencarian dan RAG.
Penyorotan dijalankan sebagai langkah pasca-pemrosesan pada kumpulan hasil pencarian akhir. Hal ini tidak memengaruhi pengambilan kandidat, logika penyaringan, peringkat, atau penilaian.
Penyorot memberikan tiga dimensi kontrol yang independen:
Istilah mana yang disorot
Anda dapat memilih dari mana istilah yang disorot berasal. Misalnya, menyorot istilah pencarian yang digunakan dalam pencarian teks lengkap BM25, atau istilah kueri yang ditentukan dalam ekspresi pemfilteran berbasis teks (seperti
TEXT_MATCHkondisi).Bagaimana istilah yang disorot ditampilkan
Anda dapat mengontrol bagaimana istilah yang cocok muncul di output penyorotan dengan mengonfigurasi tag yang disisipkan sebelum dan sesudah setiap kecocokan. Misalnya, gunakan penanda sederhana seperti
{}atau tag HTML seperti<em></em>untuk rich rendering.Bagaimana teks yang disorot dikembalikan
Anda dapat mengontrol bagaimana hasil yang disorot dikembalikan sebagai fragmen, termasuk di mana fragmen dimulai, berapa panjangnya, dan berapa banyak fragmen yang dikembalikan.
Bagian berikut akan membahas skenario ini.
Penyorotan istilah pencarian dalam pencarian teks lengkap BM25
Saat Anda melakukan pencarian teks lengkap BM25, Anda dapat menyorot istilah pencarian di hasil yang dikembalikan untuk membantu menjelaskan mengapa sebuah dokumen cocok dengan kueri. Untuk mempelajari lebih lanjut tentang pencarian teks lengkap BM25, lihat Pencarian Teks Lengkap.
Dalam skenario ini, istilah yang disorot berasal langsung dari istilah pencarian yang digunakan dalam pencarian teks lengkap BM25. Penyorot menggunakan istilah-istilah ini untuk membuat anotasi teks yang cocok pada hasil akhir.
Asumsikan konten berikut ini disimpan dalam bidang teks:
Milvus supports full text search. Use BM25 for keyword relevance. Filters can narrow results.
Konfigurasi penyorot
Untuk menyorot istilah pencarian di pencarian teks lengkap BM25, buat LexicalHighlighter dan aktifkan penyorotan istilah pencarian untuk pencarian teks lengkap BM25:
from pymilvus import LexicalHighlighter
highlighter = LexicalHighlighter(
pre_tags=["{"], # Tag inserted before each highlighted term
post_tags=["}"], # Tag inserted after each highlighted term
highlight_search_text=True # Enable search term highlighting for BM25 full text search
)
Dalam contoh ini:
pre_tagsdanpost_tagsmengontrol bagaimana teks yang disorot muncul di output. Dalam hal ini, istilah yang cocok diapit oleh{}(misalnya,{term}). Anda juga dapat memberikan beberapa tag sebagai daftar (misalnya,["<b>", "<i>"]). Ketika beberapa istilah disorot, tag diterapkan secara berurutan dan diputar berdasarkan urutan kecocokan.highlight_search_text=Truememberi tahu Milvus untuk menggunakan istilah pencarian dalam pencarian teks lengkap BM25 sebagai sumber istilah yang disorot.
Setelah objek Penyorot dibuat, terapkan konfigurasinya ke permintaan pencarian teks lengkap BM25 Anda:
results = client.search(
...,
data=["BM25"], # Search term used in BM25 full text search
highlighter=highlighter # Pass highlighter config here
)
Menyoroti keluaran
Ketika penyorotan diaktifkan, Milvus mengembalikan teks yang disorot dalam bidang highlight khusus. Secara default, keluaran yang disorot dikembalikan sebagai fragmen yang dimulai dari istilah pertama yang cocok.
Dalam contoh ini, istilah pencarian adalah "BM25", sehingga istilah tersebut disorot dalam hasil yang dikembalikan:
{
...,
"highlight": {
"text": [
"{BM25} for keyword relevance. Filters can narrow results."
]
}
}
Untuk mengontrol posisi, panjang, dan jumlah fragmen yang dikembalikan, lihat Mengembalikan teks yang disorot sebagai fragmen.
Penyorotan istilah kueri dalam pemfilteran
Selain menyorot istilah pencarian, Anda dapat menyorot istilah yang digunakan dalam ekspresi pemfilteran berbasis teks.
Saat ini, hanya kondisi pemfilteran TEXT_MATCH yang didukung untuk penyorotan istilah kueri. Untuk mempelajari lebih lanjut, lihat Pencocokan Teks.
Dalam skenario ini, istilah yang disorot berasal dari ekspresi pemfilteran berbasis teks. Pemfilteran menentukan dokumen mana yang cocok, sementara Penyorot memberi keterangan pada rentang teks yang cocok.
Asumsikan konten berikut disimpan dalam bidang teks:
This document explains how text filtering works in Milvus.
Konfigurasi penyorot
Untuk menyoroti istilah kueri yang digunakan dalam pemfilteran, buat LexicalHighlighter dan tentukan highlight_query yang sesuai dengan kondisi pemfilteran:
from pymilvus import LexicalHighlighter
highlighter = LexicalHighlighter(
pre_tags=["{"], # Tag inserted before each highlighted term
post_tags=["}"], # Tag inserted after each highlighted term
highlight_query=[{
"type": "TextMatch", # Text filtering type
"field": "text", # Target text field
"text": "text filtering" # Terms to highlight
}]
)
Dalam konfigurasi ini:
pre_tagsdanpost_tagsmengontrol bagaimana teks yang disorot muncul di output. Dalam hal ini, istilah yang cocok dibungkus dengan{}(misalnya,{term}). Anda juga dapat memberikan beberapa tag sebagai daftar (misalnya,["<b>", "<i>"]). Ketika beberapa istilah disorot, tag diterapkan secara berurutan dan diputar berdasarkan urutan kecocokan.highlight_querymendefinisikan istilah pemfilteran mana yang harus disorot.
Setelah objek Penyorot dibuat, terapkan ekspresi pemfilteran yang sama dan konfigurasi penyorot ke permintaan pencarian Anda:
results = client.search(
...,
filter='TEXT_MATCH(text, "text filtering")',
highlighter=highlighter # Pass highlighter config here
)
Menyoroti keluaran
Ketika penyorotan istilah kueri diaktifkan untuk pemfilteran, Milvus mengembalikan teks yang disorot dalam bidang highlight khusus. Secara default, keluaran yang disorot dikembalikan sebagai fragmen yang dimulai dari istilah pertama yang cocok.
Dalam contoh ini, istilah pertama yang cocok adalah "text", sehingga teks yang disorot dikembalikan mulai dari posisi tersebut:
{
...,
"highlight": {
"text": [
"{text} {filtering} works in Milvus."
]
}
}
Untuk mengontrol posisi, panjang, dan jumlah fragmen yang dikembalikan, lihat Mengembalikan teks yang disorot sebagai fragmen.
Output penyorotan berbasis fragmen
Secara default, Milvus mengembalikan teks yang disorot sebagai fragmen mulai dari istilah pertama yang cocok. Pengaturan terkait fragmen memungkinkan Anda untuk mengontrol lebih lanjut bagaimana fragmen dikembalikan, tanpa mengubah istilah mana yang disorot.
Asumsikan konten berikut disimpan dalam bidang teks:
Milvus supports full text search. Use BM25 for keyword relevance. Filters can narrow results.
Konfigurasi penyorot
Untuk mengontrol bentuk fragmen yang disorot, konfigurasikan opsi terkait fragmen di LexicalHighlighter:
from pymilvus import LexicalHighlighter
highlighter = LexicalHighlighter(
pre_tags=["{"],
post_tags=["}"],
highlight_search_text=True,
fragment_offset=5, # Number of characters to reserve before the first matched term
fragment_size=60, # Max. length of each fragment to return
num_of_fragments=1 # Max. number of fragments to return
)
Dalam konfigurasi ini:
fragment_offsetmenyimpan konteks terdepan sebelum istilah pertama yang disorot.fragment_sizemembatasi jumlah teks yang disertakan dalam setiap fragmen.num_of_fragmentsmengontrol berapa banyak fragmen yang dikembalikan.
Setelah objek Penyorot dibuat, terapkan konfigurasi penyorot ke permintaan pencarian Anda:
results = client.search(
...,
data=["BM25"],
highlighter=highlighter # Pass highlighter config here
)
Menyoroti keluaran
Dengan penyorotan berbasis fragmen diaktifkan, Milvus mengembalikan teks yang disorot sebagai fragmen di bidang highlight:
{
...,
"highlight": {
"text": [
"Use {BM25} for keyword relevance. Filters can narrow results."
]
}
}
Dalam keluaran ini:
Fragmen tidak dimulai tepat di
{BM25}karenafragment_offsettelah diatur.Hanya satu fragmen yang dikembalikan karena
num_of_fragmentsadalah 1.Panjang fragmen dibatasi oleh
fragment_size.
Contoh
Persiapan
Sebelum menggunakan penyorot, pastikan koleksi Anda dikonfigurasi dengan benar.
Contoh di bawah ini membuat koleksi yang mendukung penelusuran teks lengkap BM25 dan kueri TEXT_MATCH, lalu menyisipkan dokumen contoh.
from pymilvus import (
MilvusClient,
DataType,
Function,
FunctionType,
LexicalHighlighter,
)
client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "highlighter_demo"
# Clean up existing collection
if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME)
# Define schema
schema = client.create_schema(enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(
field_name="text",
datatype=DataType.VARCHAR,
max_length=2000,
enable_analyzer=True, # Required for BM25
enable_match=True, # Required for TEXT_MATCH
)
schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
# Add BM25 function
schema.add_function(Function(
name="text_bm25",
function_type=FunctionType.BM25,
input_field_names=["text"],
output_field_names=["sparse_vector"],
))
# Create index
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse_vector",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25",
params={"inverted_index_algo": "DAAT_MAXSCORE", "bm25_k1": 1.2, "bm25_b": 0.75},
)
client.create_collection(collection_name=COLLECTION_NAME, schema=schema, index_params=index_params)
# Insert sample documents
docs = [
"my first test doc",
"my second test doc",
"my first test doc. Milvus is an open-source vector database built for GenAI applications.",
"my second test doc. Milvus is an open-source vector database that suits AI applications "
"of every size from running a demo chatbot to building web-scale search.",
]
client.insert(collection_name=COLLECTION_NAME, data=[{"text": t} for t in docs])
print(f"✓ Collection created with {len(docs)} documents\n")
# Helper for search params
SEARCH_PARAMS = {"metric_type": "BM25", "params": {"drop_ratio_search": 0.0}}
# Expected output:
# ✓ Collection created with 4 documents
Contoh 1: Menyorot istilah pencarian dalam pencarian teks lengkap BM25
Contoh ini menunjukkan cara menyorot istilah pencarian dalam pencarian teks lengkap BM25.
Pencarian teks lengkap BM25 menggunakan
"test"sebagai istilah pencarianPenyorot membungkus semua kemunculan "tes" dengan tag
{dan}
highlighter = LexicalHighlighter(
pre_tags=["{"],
post_tags=["}"],
highlight_search_text=True, # Highlight BM25 query terms
)
results = client.search(
collection_name=COLLECTION_NAME,
data=["test"],
anns_field="sparse_vector",
limit=10,
search_params=SEARCH_PARAMS,
output_fields=["text"],
highlighter=highlighter,
)
for hit in results[0]:
print(f" {hit.get('highlight', {}).get('text', [])}")
print()
['{test} doc']
['{test} doc']
['{test} doc. Milvus is an open-source vector database built for GenAI applications.']
['{test} doc. Milvus is an open-source vector database that suits AI applications of every size from run']
Contoh 2: Menyorot istilah kueri dalam pemfilteran
Contoh ini menunjukkan cara menyorot istilah yang cocok dengan filter TEXT_MATCH.
Pencarian teks lengkap BM25 menggunakan
"test"sebagai istilah kueriParameter
queriesmenambahkan"my doc"ke daftar sorotanPenyorot membungkus semua istilah yang cocok (
"my","test","doc") dengan{dan}
highlighter = LexicalHighlighter(
pre_tags=["{"],
post_tags=["}"],
highlight_search_text=True, # Also highlight BM25 term
highlight_query=[ # Additional TEXT_MATCH terms to highlight
{"type": "TextMatch", "field": "text", "text": "my doc"},
],
)
results = client.search(
collection_name=COLLECTION_NAME,
data=["test"],
anns_field="sparse_vector",
limit=10,
search_params=SEARCH_PARAMS,
output_fields=["text"],
highlighter=highlighter,
)
for hit in results[0]:
print(f" {hit.get('highlight', {}).get('text', [])}")
print()
['{my} first {test} {doc}']
['{my} second {test} {doc}']
['{my} first {test} {doc}. Milvus is an open-source vector database built for GenAI applications.']
['{my} second {test} {doc}. Milvus is an open-source vector database that suits AI applications of every siz']
Contoh 3: Mengembalikan sorotan sebagai fragmen
Dalam contoh ini, kueri mencari "Milvus" dan mengembalikan fragmen sorotan dalam pengaturan berikut:
fragment_offsetmenyimpan hingga 20 karakter sebelum rentang yang disorot pertama sebagai konteks utama (standarnya 0).fragment_sizemembatasi setiap fragmen hingga sekitar 60 karakter (standarnya adalah 100).num_of_fragmentsmembatasi jumlah fragmen yang dikembalikan per nilai teks (standarnya adalah 5).
highlighter = LexicalHighlighter(
pre_tags=["{"],
post_tags=["}"],
highlight_search_text=True,
fragment_offset=20, # Keep 20 chars before match
fragment_size=60, # Max ~60 chars per fragment
)
results = client.search(
collection_name=COLLECTION_NAME,
data=["Milvus"],
anns_field="sparse_vector",
limit=10,
search_params=SEARCH_PARAMS,
output_fields=["text"],
highlighter=highlighter,
)
for i, hit in enumerate(results[0]):
frags = hit.get('highlight', {}).get('text', [])
print(f" Doc {i+1}: {frags}")
print()
Doc 1: ['my first test doc. {Milvus} is an open-source vector database ']
Doc 2: ['my second test doc. {Milvus} is an open-source vector database']
Contoh 4: Penyorotan beberapa kueri
Saat mencari dengan beberapa kueri dalam pencarian teks lengkap BM25, setiap hasil kueri disorot secara terpisah. Hasil kueri pertama berisi sorotan untuk istilah pencariannya, dan hasil kueri kedua berisi sorotan untuk istilah pencariannya, dan seterusnya. Setiap kueri menggunakan konfigurasi highlighter yang sama tetapi menerapkannya secara independen.
Pada contoh di bawah ini:
Kueri pertama menyoroti
"test"dalam kumpulan hasilnyaKueri kedua menyoroti
"Milvus"dalam kumpulan hasilnya
highlighter = LexicalHighlighter(
pre_tags=["{"],
post_tags=["}"],
highlight_search_text=True,
)
results = client.search(
collection_name=COLLECTION_NAME,
data=["test", "Milvus"], # Two queries
anns_field="sparse_vector",
limit=2,
search_params=SEARCH_PARAMS,
output_fields=["text"],
highlighter=highlighter,
)
for nq_idx, hits in enumerate(results):
query_term = ["test", "Milvus"][nq_idx]
print(f" Query '{query_term}':")
for hit in hits:
print(f" {hit.get('highlight', {}).get('text', [])}")
print()
Query 'test':
['{test} doc']
['{test} doc']
Query 'Milvus':
['{Milvus} is an open-source vector database built for GenAI applications.']
['{Milvus} is an open-source vector database that suits AI applications of every size from running a dem']
Contoh 5: Tag HTML khusus
Anda dapat menggunakan tag apa pun untuk penyorotan, seperti tag HTML yang aman untuk UI web. Hal ini berguna saat merender hasil penelusuran di browser.
highlighter = LexicalHighlighter(
pre_tags=["<mark>"],
post_tags=["</mark>"],
highlight_search_text=True,
)
results = client.search(
collection_name=COLLECTION_NAME,
data=["test"],
anns_field="sparse_vector",
limit=2,
search_params=SEARCH_PARAMS,
output_fields=["text"],
highlighter=highlighter,
)
for hit in results[0]:
print(f" {hit.get('highlight', {}).get('text', [])}")
print()
['<mark>test</mark> doc']
['<mark>test</mark> doc']