PhrasensucheCompatible with Milvus 2.5.17+

Mit der Phrasenübereinstimmung können Sie nach Dokumenten suchen, die Ihre Suchbegriffe als exakte Phrase enthalten. Standardmäßig müssen die Wörter in der gleichen Reihenfolge und in unmittelbarer Nähe zueinander erscheinen. Eine Abfrage nach "Robotik, maschinelles Lernen" passt beispielsweise zu Text wie "...typische Robotik, maschinelle Lernmodelle...", in dem die Wörter "Robotik", "Maschine" und "Lernen" nacheinander und ohne andere Wörter dazwischen erscheinen.

In realen Szenarien kann ein strenger Phrasenabgleich jedoch zu starr sein. Sie möchten vielleicht Text wie "...maschinelle Lernmodelle, die in der Robotik weit verbreitet sind..." abgleichen. Hier sind die gleichen Schlüsselwörter vorhanden, aber nicht nebeneinander oder in der ursprünglichen Reihenfolge. Um damit umzugehen, unterstützt die Phrasenübereinstimmung einen slop -Parameter, der für Flexibilität sorgt. Der Wert slop legt fest, wie viele Positionsverschiebungen zwischen den Begriffen in der Phrase zulässig sind. Bei einem Wert von slop von 1 kann beispielsweise eine Abfrage nach "machine learning" mit Text wie "...machine deep learning..." übereinstimmen , wobei ein Wort ("deep") die ursprünglichen Begriffe trennt.

Übersicht

Die von der Tantivy-Suchmaschinenbibliothek unterstützte Phrasenübereinstimmung funktioniert durch die Analyse der Positionsinformationen von Wörtern in Dokumenten. Das folgende Diagramm veranschaulicht den Prozess:

Phrase Match Workflow Phrase Match Arbeitsablauf

  1. Tokenisierung von Dokumenten: Wenn Sie Dokumente in Milvus einfügen, wird der Text mithilfe eines Analysators in Token (einzelne Wörter oder Begriffe) aufgeteilt, wobei für jedes Token Positionsinformationen aufgezeichnet werden. Zum Beispiel wird doc_1 in ["machine" (pos=0), "learning" (pos=1), "boosts" (pos=2), "efficiency" (pos=3)] tokenisiert. Weitere Informationen zu Analyzern finden Sie unter Analyzer-Übersicht.

  2. Erstellung eines invertierten Index: Milvus erstellt einen invertierten Index, der jedes Token den Dokumenten, in denen es vorkommt, und den Positionen des Tokens in diesen Dokumenten zuordnet.

  3. Phrase Matching: Wenn eine Phrasenabfrage ausgeführt wird, sucht Milvus nach jedem Token im invertierten Index und überprüft ihre Positionen, um festzustellen, ob sie in der richtigen Reihenfolge und in der richtigen Nähe erscheinen. Der Parameter slop steuert die maximal zulässige Anzahl von Positionen zwischen übereinstimmenden Token:

    • slop = 0 bedeutet, dass die Token in der exakten Reihenfolge und unmittelbar nebeneinander erscheinen müssen (d. h. keine zusätzlichen Wörter dazwischen).

      • Im Beispiel passt nur doc_1 ("machine" an Pos=0, "learning" an Pos=1) genau.
    • slop = 2 lässt bis zu zwei Positionen Flexibilität oder Umstellungen zwischen übereinstimmenden Token zu.

      • Dies ermöglicht eine umgekehrte Reihenfolge ("Lernmaschine") oder eine kleine Lücke zwischen den Token.

      • Folglich stimmen doc_1, doc_2 ("learning" an Pos=0, "machine" an Pos=1) und doc_3 ("learning" an Pos=1, "machine" an Pos=2) alle überein.

Phrasenübereinstimmung aktivieren

Die Phrasenübereinstimmung funktioniert mit dem Feldtyp VARCHAR, dem String-Datentyp in Milvus. Um den Phrasenabgleich zu aktivieren, konfigurieren Sie Ihr Sammlungsschema, indem Sie die beiden Parameter enable_analyzer und enable_match auf True setzen, ähnlich wie beim Textabgleich.

Setzen Sie enable_analyzer und enable_match

Um den Phrasenabgleich für ein bestimmtes VARCHAR Feld zu aktivieren, setzen Sie die beiden Parameter enable_analyzer und enable_match bei der Definition des Feldschemas auf True. Diese Konfiguration weist Milvus an, den Text zu tokenisieren und einen invertierten Index mit Positionsinformationen zu erstellen, die für einen effizienten Phrasenabgleich erforderlich sind.

Hier ein Beispiel für eine Schemadefinition zur Aktivierung des Phrasenabgleichs:

from pymilvus import MilvusClient, DataType

# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
    field_name="id",
    datatype=DataType.INT64,
    is_primary=True,
    auto_id=True
)
# Add a VARCHAR field configured for phrase matching
schema.add_field(
    field_name='text',                 # Name of the field
    datatype=DataType.VARCHAR,         # Field data type set as VARCHAR (string)
    max_length=1000,                   # Maximum length of the string
    enable_analyzer=True,              # Enables text analysis (tokenization)
    enable_match=True                  # Enables inverted indexing for phrase matching
)
schema.add_field(
    field_name="embeddings",
    datatype=DataType.FLOAT_VECTOR,
    dim=5
)

Optional: Konfigurieren Sie einen Analysator

Die Genauigkeit des Phrasenabgleichs hängt wesentlich von dem Analysator ab, der Ihre Textdaten tokenisiert. Verschiedene Analysatoren eignen sich für unterschiedliche Sprachen und Textformate, was sich auf die Tokenisierung und die Positionsgenauigkeit auswirkt. Die Auswahl eines geeigneten Analysators für Ihren speziellen Anwendungsfall optimiert die Ergebnisse des Phrasenabgleichs.

Standardmäßig verwendet Milvus den Standard-Analysator, der Text auf der Grundlage von Leerzeichen und Interpunktion in Token umwandelt, Token mit mehr als 40 Zeichen entfernt und Text in Kleinbuchstaben konvertiert. Für die Standardverwendung sind keine zusätzlichen Parameter erforderlich. Weitere Informationen finden Sie unter Standard-Analysator.

Wenn Ihre Anwendung einen bestimmten Analyzer benötigt, konfigurieren Sie ihn mit dem Parameter analyzer_params. So konfigurieren Sie z. B. den Analysator english für die Phrasenerkennung in englischem Text:

# Define analyzer parameters for English-language tokenization
analyzer_params = {
    "type": "english"
}

# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
    field_name='text',                 # Name of the field
    datatype=DataType.VARCHAR,         # Field data type set as VARCHAR
    max_length=1000,                   # Maximum length of the string
    enable_analyzer=True,              # Enables text analysis
    analyzer_params=analyzer_params,   # Specifies the analyzer configuration
    enable_match=True                  # Enables inverted indexing for phrase matching
)

Milvus unterstützt mehrere Analysatoren, die für verschiedene Sprachen und Anwendungsfälle zugeschnitten sind. Detaillierte Informationen finden Sie unter Analyzer-Übersicht.

Phrasenabgleich verwenden

Sobald Sie den Abgleich für ein VARCHAR Feld in Ihrem Sammlungsschema aktiviert haben, können Sie Phrasenabgleiche mit dem PHRASE_MATCH Ausdruck durchführen.

Beim PHRASE_MATCH -Ausdruck wird die Groß-/Kleinschreibung nicht berücksichtigt. Sie können entweder PHRASE_MATCH oder phrase_match verwenden.

Syntax des PHRASE_MATCH-Ausdrucks

Verwenden Sie den Ausdruck PHRASE_MATCH, um das Feld, die Phrase und die optionale Flexibilität (slop) bei der Suche anzugeben. Die Syntax lautet:

PHRASE_MATCH(field_name, phrase, slop)
  • field_name: Der Name des Feldes VARCHAR, für das Sie Phrasentreffer durchführen.

  • phrase: Die genaue Phrase, nach der gesucht werden soll.

  • slop (optional): Eine ganze Zahl, die die maximal zulässige Anzahl von Positionen in übereinstimmenden Token angibt.

    • 0 (Standard): Es werden nur exakte Phrasen gefunden. Beispiel: Ein Filter für "maschinelles Lernen" passt genau auf "maschinelles Lernen", aber nicht auf "Maschine verstärkt Lernen" oder "Lernmaschine".

    • 1: Erlaubt geringfügige Abweichungen, z. B. einen zusätzlichen Begriff oder eine geringfügige Verschiebung der Position. Beispiel: Ein Filter für "maschinelles Lernen" passt zu "maschinelles Lernen" (ein Token zwischen "Maschine" und "Lernen"), aber nicht zu "Lernmaschine" (Begriffe vertauscht).

    • 2: Ermöglicht mehr Flexibilität, einschließlich der umgekehrten Reihenfolge der Begriffe oder bis zu zwei Token dazwischen. Beispiel: Ein Filter für "maschinelles Lernen" passt zu "Lernmaschine" (umgekehrte Begriffe) oder "Maschine fördert schnell das Lernen" (zwei Token zwischen "Maschine" und "Lernen").

Beispiel-Datensatz

Angenommen, Sie haben eine Sammlung mit dem Namen tech_articles, die die folgenden fünf Entitäten enthält:

doc_id

text

1

"Maschinelles Lernen steigert die Effizienz bei der Analyse großer Datenmengen"

2

"Das Erlernen eines maschinenbasierten Ansatzes ist für den Fortschritt der modernen KI unerlässlich"

3

"Maschinenarchitekturen für maschinelles Lernen optimieren die Rechenlast"

4

"Maschine verbessert schnell die Modellleistung für fortlaufendes Lernen"

5

"Das Lernen fortschrittlicher Maschinenalgorithmen erweitert die KI-Fähigkeiten"

Abfrage mit Phrasenübereinstimmung

Bei Verwendung der Methode query() fungiert PHRASE_MATCH als skalarer Filter. Es werden nur Dokumente zurückgegeben, die die angegebene Phrase enthalten (vorbehaltlich der zulässigen Abweichung).

Beispiel: slop = 0 (exakte Übereinstimmung)

In diesem Beispiel werden Dokumente zurückgegeben, die den exakten Ausdruck "maschinelles Lernen" enthalten, ohne dazwischen liegende zusätzliche Token.

# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"

result = client.query(
    collection_name="tech_articles",
    filter=filter,
    output_fields=["id", "text"]
)

Erwartete Übereinstimmungsergebnisse:

doc_id

text

1

"Maschinelles Lernen steigert die Effizienz bei der Analyse großer Datenmengen"

Nur Dokument 1 enthält den exakten Ausdruck "maschinelles Lernen" in der angegebenen Reihenfolge und ohne zusätzliche Zeichen.

Suche mit Phrasenübereinstimmung

Bei Suchvorgängen wird PHRASE_MATCH verwendet, um Dokumente zu filtern, bevor die Vektorähnlichkeitsbewertung angewendet wird. Dieser zweistufige Ansatz grenzt die Kandidatenmenge zunächst durch Textübereinstimmung ein und ordnet diese Kandidaten dann auf der Grundlage von Vektoreinbettungen neu ein.

Beispiel: slop = 1

Hier erlauben wir einen Slop von 1. Der Filter wird auf Dokumente angewandt, die den Ausdruck "Lernmaschine" mit leichter Flexibilität enthalten.

# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"

result_slop1 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",
    data=[query_vector],
    filter=filter_slop1,
    search_params={"params": {"nprobe": 10}},
    limit=10,
    output_fields=["id", "text"]
)

Ergebnisse der Übereinstimmung:

doc_id

text

2

"Das Erlernen eines maschinenbasierten Ansatzes ist für den modernen KI-Fortschritt unerlässlich"

3

"Deep Learning-Maschinenarchitekturen optimieren die Rechenlast"

5

"Das Erlernen fortgeschrittener maschineller Algorithmen erweitert die Fähigkeiten der KI"

Beispiel: slop = 2

In diesem Beispiel ist ein Slop von 2 erlaubt, was bedeutet, dass bis zu zwei zusätzliche Token (oder umgekehrte Begriffe) zwischen den Wörtern "Maschine" und "Lernen" erlaubt sind .

# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"

result_slop2 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",             # Vector field name
    data=[query_vector],                 # Query vector
    filter=filter_slop2,                 # Filter expression
    search_params={"params": {"nprobe": 10}},
    limit=10,                            # Maximum results to return
    output_fields=["id", "text"]
)

Übereinstimmende Ergebnisse:

doc_id

text

1

"Maschinelles Lernen steigert die Effizienz bei der Analyse großer Datenmengen"

3

"Maschinenarchitekturen für maschinelles Lernen optimieren die Rechenlast"

Beispiel: slop = 3

In diesem Beispiel sorgt ein Slop von 3 für noch mehr Flexibilität. Der Filter sucht nach "maschinellem Lernen", wobei bis zu drei Token-Positionen zwischen den Wörtern zulässig sind.

# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"

result_slop2 = client.search(
    collection_name="tech_articles",
    anns_field="embeddings",             # Vector field name
    data=[query_vector],                 # Query vector
    filter=filter_slop3,                 # Filter expression
    search_params={"params": {"nprobe": 10}},
    limit=10,                            # Maximum results to return
    output_fields=["id", "text"]
)

Übereinstimmende Ergebnisse:

doc_id

text

1

"Maschinelles Lernen steigert die Effizienz bei der Analyse großer Datenmengen"

2

"Das Erlernen eines maschinenbasierten Ansatzes ist für den Fortschritt der modernen KI unerlässlich"

3

"Maschinenarchitekturen für maschinelles Lernen optimieren die Rechenlast"

5

"Das Erlernen fortgeschrittener maschineller Algorithmen erweitert die KI-Fähigkeiten"

Erwägungen

  • Die Aktivierung des Phrasenabgleichs für ein Feld löst die Erstellung eines invertierten Indexes aus, der Speicherressourcen verbraucht. Berücksichtigen Sie die Auswirkungen auf den Speicherplatz, wenn Sie sich für die Aktivierung dieser Funktion entscheiden, da diese je nach Textgröße, eindeutigen Token und dem verwendeten Analysator variieren.

  • Sobald Sie einen Analyzer in Ihrem Schema definiert haben, werden seine Einstellungen für diese Sammlung dauerhaft. Wenn Sie entscheiden, dass ein anderes Analyseprogramm besser zu Ihren Anforderungen passt, können Sie die vorhandene Sammlung löschen und eine neue Sammlung mit der gewünschten Analysekonfiguration erstellen.

  • Die Leistung der Phrasenübereinstimmung hängt davon ab, wie der Text tokenisiert wird. Bevor Sie einen Analyzer auf Ihre gesamte Sammlung anwenden, sollten Sie die Methode run_analyzer verwenden, um die Tokenisierungsausgabe zu überprüfen. Weitere Informationen finden Sie unter Analyzer-Übersicht.

  • Escape-Regeln in filter Ausdrücken:

    • Zeichen, die in doppelten oder einfachen Anführungszeichen innerhalb von Ausdrücken eingeschlossen sind, werden als Stringkonstanten interpretiert. Wenn die Zeichenkettenkonstante Escape-Zeichen enthält, müssen die Escape-Zeichen mit einer Escape-Sequenz dargestellt werden. Verwenden Sie zum Beispiel \\ für \, \\t für einen Tabulator \t und \\n für einen Zeilenumbruch.

    • Wenn eine Stringkonstante von einfachen Anführungszeichen eingeschlossen ist, sollte ein einfaches Anführungszeichen innerhalb der Konstante als \\' dargestellt werden, während ein doppeltes Anführungszeichen entweder als " oder \\" dargestellt werden kann. Beispiel: 'It\\'s milvus'.

    • Wenn eine String-Konstante von doppelten Anführungszeichen eingeschlossen ist, sollte ein doppeltes Anführungszeichen innerhalb der Konstante als \\" dargestellt werden, während ein einfaches Anführungszeichen entweder als ' oder \\' dargestellt werden kann. Beispiel: "He said \\"Hi\\"".