Text-HighlighterCompatible with Milvus 2.6.8+
Der Highlighter in Milvus kommentiert übereinstimmende Begriffe in Textfeldern, indem er sie mit anpassbaren Tags umgibt. Die Hervorhebung hilft zu erklären, warum ein Dokument übereinstimmt, verbessert die Lesbarkeit der Ergebnisse und unterstützt das Rich Rendering in Such- und RAG-Anwendungen.
Die Hervorhebung wird als Nachbearbeitungsschritt für die endgültige Suchergebnismenge ausgeführt. Es hat keinen Einfluss auf die Suche nach Kandidaten, die Filterlogik, das Ranking oder die Bewertung.
Der Highlighter bietet drei unabhängige Dimensionen der Kontrolle:
Welche Begriffe werden hervorgehoben
Sie können wählen, woher die hervorgehobenen Begriffe stammen. Sie können zum Beispiel Suchbegriffe hervorheben, die in der BM25-Volltextsuche verwendet werden, oder Abfragebegriffe, die in textbasierten Filterausdrücken angegeben sind (z. B.
TEXT_MATCHBedingungen).Wie hervorgehobene Begriffe dargestellt werden
Sie können steuern, wie übereinstimmende Begriffe in der Hervorhebungsausgabe angezeigt werden, indem Sie die Tags konfigurieren, die vor und nach jeder Übereinstimmung eingefügt werden. Verwenden Sie z. B. einfache Markierungen wie
{}oder HTML-Tags wie<em></em>für eine umfassende Darstellung.Wie hervorgehobener Text zurückgegeben wird
Sie können steuern, wie hervorgehobene Ergebnisse als Fragmente zurückgegeben werden, einschließlich der Frage, wo die Fragmente beginnen, wie lang sie sind und wie viele Fragmente zurückgegeben werden.
In den folgenden Abschnitten werden diese Szenarien durchgespielt.
Hervorhebung von Suchbegriffen in der BM25-Volltextsuche
Wenn Sie eine BM25-Volltextsuche durchführen, können Sie die Suchbegriffe im zurückgegebenen Ergebnis hervorheben, um zu erklären, warum ein Dokument der Anfrage entspricht. Weitere Informationen zur BM25-Volltextsuche finden Sie unter Volltextsuche.
In diesem Szenario stammen die hervorgehobenen Begriffe direkt von den in der BM25-Volltextsuche verwendeten Suchbegriffen. Der Highlighter verwendet diese Begriffe, um den übereinstimmenden Text im Endergebnis zu kennzeichnen.
Angenommen, der folgende Inhalt wird in einem Textfeld gespeichert:
Milvus supports full text search. Use BM25 for keyword relevance. Filters can narrow results.
Highlighter-Konfiguration
Um Suchbegriffe in der BM25-Volltextsuche hervorzuheben, erstellen Sie eine LexicalHighlighter und aktivieren Sie die Hervorhebung von Suchbegriffen für die BM25-Volltextsuche:
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
)
In diesem Beispiel:
pre_tagsundpost_tagssteuern, wie der hervorgehobene Text in der Ausgabe erscheint. In diesem Fall werden die übereinstimmenden Begriffe von{}umschlossen (z. B.{term}). Sie können auch mehrere Schlagwörter in einer Liste angeben (z. B.["<b>", "<i>"]). Wenn mehrere Begriffe hervorgehoben sind, werden die Tags in der Reihenfolge der Übereinstimmung angewendet und gedreht.highlight_search_text=Trueweist Milvus an, die Suchbegriffe in der BM25-Volltextsuche als Quelle der hervorgehobenen Begriffe zu verwenden.
Sobald das Highlighter-Objekt erstellt ist, wenden Sie seine Konfiguration auf Ihre BM25-Volltextsuchanfrage an:
results = client.search(
...,
data=["BM25"], # Search term used in BM25 full text search
highlighter=highlighter # Pass highlighter config here
)
Hervorhebende Ausgabe
Wenn die Hervorhebung aktiviert ist, gibt Milvus den hervorgehobenen Text in einem speziellen Feld highlight zurück. Standardmäßig wird die hervorgehobene Ausgabe als Fragment zurückgegeben, beginnend mit dem ersten übereinstimmenden Begriff.
In diesem Beispiel ist der Suchbegriff "BM25", so dass er im zurückgegebenen Ergebnis hervorgehoben ist:
{
...,
"highlight": {
"text": [
"{BM25} for keyword relevance. Filters can narrow results."
]
}
}
Um die Position, Länge und Anzahl der zurückgegebenen Fragmente zu steuern, siehe Hervorgehobenen Text als Fragmente zurückgeben.
Hervorhebung von Suchbegriffen bei der Filterung
Zusätzlich zur Hervorhebung von Suchbegriffen können Sie auch Begriffe hervorheben, die in textbasierten Filterausdrücken verwendet werden.
Derzeit wird nur die Filterbedingung TEXT_MATCH für die Hervorhebung von Suchbegriffen unterstützt. Weitere Informationen finden Sie unter Textabgleich.
In diesem Szenario stammen die hervorgehobenen Begriffe aus textbasierten Filterausdrücken. Die Filterung bestimmt, welche Dokumente übereinstimmen, während der Highlighter die übereinstimmenden Textabschnitte mit Anmerkungen versieht.
Angenommen, der folgende Inhalt wird in einem Textfeld gespeichert:
This document explains how text filtering works in Milvus.
Textmarker-Konfiguration
Um Abfrageausdrücke, die bei der Filterung verwendet werden, hervorzuheben, erstellen Sie eine LexicalHighlighter und definieren Sie eine highlight_query, die der Filterungsbedingung entspricht:
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
}]
)
In dieser Konfiguration:
pre_tagsundpost_tagssteuern, wie der hervorgehobene Text in der Ausgabe erscheint. In diesem Fall werden die übereinstimmenden Begriffe von{}umschlossen (z. B.{term}). Sie können auch mehrere Tags als Liste angeben (z. B.["<b>", "<i>"]). Wenn mehrere Begriffe hervorgehoben werden, werden die Tags in der Reihenfolge der Übereinstimmung angewendet und gedreht.highlight_querydefiniert, welche Filterbegriffe hervorgehoben werden sollen.
Sobald das Highlighter-Objekt erstellt ist, wenden Sie denselben Filterausdruck und die Highlighter-Konfiguration auf Ihre Suchanfrage an:
results = client.search(
...,
filter='TEXT_MATCH(text, "text filtering")',
highlighter=highlighter # Pass highlighter config here
)
Hervorhebung der Ausgabe
Wenn die Hervorhebung von Suchbegriffen für die Filterung aktiviert ist, gibt Milvus den hervorgehobenen Text in einem speziellen highlight Feld zurück. Standardmäßig wird die hervorgehobene Ausgabe als Fragment zurückgegeben, beginnend mit dem ersten übereinstimmenden Begriff.
In diesem Beispiel ist der erste übereinstimmende Begriff "text", so dass der hervorgehobene Text an dieser Position beginnt:
{
...,
"highlight": {
"text": [
"{text} {filtering} works in Milvus."
]
}
}
Um die Position, Länge und Anzahl der zurückgegebenen Fragmente zu steuern, siehe Hervorgehobenen Text als Fragmente zurückgeben.
Fragmentbasierte Hervorhebungsausgabe
Standardmäßig gibt Milvus hervorgehobenen Text als Fragmente zurück, beginnend mit dem ersten übereinstimmenden Begriff. Mit den fragmentbezogenen Einstellungen können Sie weiter steuern, wie die Fragmente zurückgegeben werden, ohne die hervorgehobenen Begriffe zu ändern.
Angenommen, der folgende Inhalt ist in einem Textfeld gespeichert:
Milvus supports full text search. Use BM25 for keyword relevance. Filters can narrow results.
Hervorhebungskonfiguration
Um die Form der hervorgehobenen Fragmente zu steuern, konfigurieren Sie fragmentbezogene Optionen in der 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
)
In dieser Konfiguration:
fragment_offsetreserviert führenden Kontext vor dem ersten hervorgehobenen Begriff.fragment_sizebegrenzt, wie viel Text in jedem Fragment enthalten ist.num_of_fragmentssteuert, wie viele Fragmente zurückgegeben werden.
Sobald das Highlighter-Objekt erstellt ist, wenden Sie die Highlighter-Konfiguration auf Ihre Suchanfrage an:
results = client.search(
...,
data=["BM25"],
highlighter=highlighter # Pass highlighter config here
)
Hervorhebung der Ausgabe
Wenn die fragmentbasierte Hervorhebung aktiviert ist, gibt Milvus den hervorgehobenen Text als Fragmente im Feld highlight aus:
{
...,
"highlight": {
"text": [
"Use {BM25} for keyword relevance. Filters can narrow results."
]
}
}
In dieser Ausgabe:
Das Fragment beginnt nicht genau bei
{BM25}, weilfragment_offsetgesetzt ist.Es wird nur ein Fragment zurückgegeben, da
num_of_fragmentsgleich 1 ist.Die Länge des Fragments wird durch
fragment_sizebegrenzt.
Beispiele
Vorbereitung
Bevor Sie den Textmarker verwenden, stellen Sie sicher, dass Ihre Sammlung richtig konfiguriert ist.
Das folgende Beispiel erstellt eine Sammlung, die BM25-Volltextsuche und TEXT_MATCH -Abfragen unterstützt, und fügt dann Beispieldokumente ein.
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
Beispiel 1: Hervorhebung von Suchbegriffen in der BM25-Volltextsuche
Dieses Beispiel zeigt, wie Sie Suchbegriffe in der BM25-Volltextsuche hervorheben können.
Die BM25-Volltextsuche verwendet
"test"als SuchbegriffDer Textmarker umschließt alle Vorkommen von "test" mit den Tags
{und}
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']
Beispiel 2: Hervorhebung von Suchbegriffen bei der Filterung
Dieses Beispiel zeigt, wie Begriffe hervorgehoben werden können, die mit einem TEXT_MATCH Filter übereinstimmen.
Die BM25-Volltextsuche verwendet
"test"als AbfragebegriffDer Parameter
queriesfügt"my doc"zur Hervorhebungsliste hinzu.Der Hervorhebungsfilter umschließt alle übereinstimmenden Begriffe (
"my","test","doc") mit{und}
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']
Beispiel 3: Hervorhebungen als Fragmente zurückgeben
In diesem Beispiel sucht die Abfrage nach "Milvus" und gibt Hervorhebungsfragmente mit den folgenden Einstellungen zurück:
fragment_offsetBehält bis zu 20 Zeichen vor der ersten hervorgehobenen Spanne als führenden Kontext bei (Standard ist 0).fragment_sizeBegrenzt jedes Fragment auf etwa 60 Zeichen (Standard ist 100).num_of_fragmentsbegrenzt die Anzahl der zurückgegebenen Fragmente pro Textwert (Standardwert ist 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']
Beispiel 4: Hervorhebung mehrerer Abfragen
Bei der Suche mit mehreren Abfragen in der BM25-Volltextsuche werden die Ergebnisse jeder Abfrage unabhängig voneinander hervorgehoben. Die Ergebnisse der ersten Abfrage enthalten Hervorhebungen für ihren Suchbegriff, die Ergebnisse der zweiten Abfrage enthalten Hervorhebungen für ihren Suchbegriff und so weiter. Jede Abfrage verwendet dieselbe highlighter Konfiguration, wendet sie aber unabhängig voneinander an.
Im folgenden Beispiel:
Die erste Abfrage hebt
"test"in ihrer Ergebnismenge hervor.Die zweite Abfrage hebt in ihrer Ergebnismenge
"Milvus"hervor.
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']
Beispiel 5: Benutzerdefinierte HTML-Tags
Sie können beliebige Tags für die Hervorhebung verwenden, z. B. HTML-sichere Tags für Web-UIs. Dies ist nützlich, wenn die Suchergebnisse in einem Browser dargestellt werden.
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']