Milvus
Zilliz
Home
  • Benutzerhandbuch

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_MATCH Bedingungen).

  • 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.

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_tags und post_tags steuern, 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=True weist 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_tags und post_tags steuern, 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_query definiert, 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_offset reserviert führenden Kontext vor dem ersten hervorgehobenen Begriff.

  • fragment_size begrenzt, wie viel Text in jedem Fragment enthalten ist.

  • num_of_fragments steuert, 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}, weil fragment_offset gesetzt ist.

  • Es wird nur ein Fragment zurückgegeben, da num_of_fragments gleich 1 ist.

  • Die Länge des Fragments wird durch fragment_size begrenzt.

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.

Bereiten Sie Ihre Sammlung vor

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

Dieses Beispiel zeigt, wie Sie Suchbegriffe in der BM25-Volltextsuche hervorheben können.

  • Die BM25-Volltextsuche verwendet "test" als Suchbegriff

  • Der 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()

Erwartete Ausgabe

['{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 Abfragebegriff

  • Der Parameter queries fü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()

Erwartete Ausgabe

['{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_offset Behält bis zu 20 Zeichen vor der ersten hervorgehobenen Spanne als führenden Kontext bei (Standard ist 0).

  • fragment_size Begrenzt jedes Fragment auf etwa 60 Zeichen (Standard ist 100).

  • num_of_fragments begrenzt 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()

Erwartete Ausgabe

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()

Erwartete Ausgabe

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()

Erwartete Ausgabe

['<mark>test</mark> doc']
['<mark>test</mark> doc']