🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI
  • Home
  • Blog
  • Verwendung von Zeichenkettendaten zur Verbesserung Ihrer Anwendungen für die Ähnlichkeitssuche

Verwendung von Zeichenkettendaten zur Verbesserung Ihrer Anwendungen für die Ähnlichkeitssuche

  • Engineering
August 08, 2022
Xi Ge

Cover Umschlag

Milvus 2.1 kommt mit einigen bedeutenden Aktualisierungen, die die Arbeit mit Milvus wesentlich erleichtern. Eine davon ist die Unterstützung von String-Datentypen. Im Moment unterstützt Milvus Datentypen wie Strings, Vektoren, Boolesche, Ganzzahlen, Gleitkommazahlen und mehr.

Dieser Artikel bietet eine Einführung in die Unterstützung von String-Datentypen. Lesen Sie ihn und erfahren Sie, was Sie damit machen können und wie Sie ihn verwenden.

Springen Sie zu:

Die Unterstützung des Datentyps String war eine der von den Benutzern am meisten erwarteten Funktionen. Sie rationalisiert sowohl den Prozess der Erstellung einer Anwendung mit der Milvus-Vektordatenbank als auch die Geschwindigkeit der Ähnlichkeitssuche und der Vektorabfrage, wodurch die Effizienz erheblich gesteigert und die Wartungskosten der Anwendung, an der Sie arbeiten, reduziert werden.

Milvus 2.1 unterstützt insbesondere den VARCHAR-Datentyp, der Zeichenketten unterschiedlicher Länge speichert. Mit der Unterstützung des VARCHAR-Datentyps können Sie:

  1. Direkte Verwaltung von Zeichenkettendaten ohne die Hilfe einer externen relationalen Datenbank.

Die Unterstützung des VARCHAR-Datentyps ermöglicht es Ihnen, beim Einfügen von Daten in Milvus den Schritt der Konvertierung von Zeichenketten in andere Datentypen zu überspringen. Nehmen wir an, Sie arbeiten an einem Buchsuchsystem für Ihren eigenen Online-Buchladen. Sie erstellen einen Buchdatensatz und möchten die Bücher mit ihren Namen identifizieren. Während Milvus in früheren Versionen den String-Datentyp nicht unterstützt, müssen Sie vor dem Einfügen von Daten in Milvus die Strings (die Namen der Bücher) mit Hilfe einer relationalen Datenbank wie MySQL in Buch-IDs umwandeln. Da jetzt der Datentyp String unterstützt wird, können Sie einfach ein Stringfeld erstellen und die Buchnamen anstelle der ID-Nummern direkt eingeben.

Die Bequemlichkeit gilt auch für den Such- und Abfrageprozess. Stellen Sie sich vor, es gibt einen Kunden, dessen Lieblingsbuch "Hallo Milvus" ist. Sie möchten im System nach ähnlichen Büchern suchen und sie dem Kunden empfehlen. In früheren Versionen von Milvus liefert Ihnen das System nur Buch-IDs, und Sie müssen einen zusätzlichen Schritt unternehmen, um die entsprechenden Buchinformationen in einer relationalen Datenbank zu überprüfen. In Milvus 2.1 können Sie jedoch die Buchnamen direkt abrufen, da Sie bereits ein String-Feld mit den Buchnamen darin erstellt haben.

Mit einem Wort, die Unterstützung des String-Datentyps erspart Ihnen den Aufwand, sich an andere Tools zu wenden, um String-Daten zu verwalten, was den Entwicklungsprozess erheblich vereinfacht.

  1. Beschleunigen Sie die Geschwindigkeit der hybriden Suche und der Vektorabfrage durch Attributfilterung.

Wie andere skalare Datentypen kann VARCHAR für die Attributfilterung in der hybriden Suche und Vektorabfrage durch boolesche Ausdrücke verwendet werden. Besonders erwähnenswert ist, dass Milvus 2.1 den Operator like hinzufügt, der es Ihnen ermöglicht, ein Präfix-Matching durchzuführen. Außerdem können Sie mit dem Operator == ein exaktes Matching durchführen.

Außerdem wird ein MARISA-trie-basierter invertierter Index unterstützt, um die hybride Suche und Abfrage zu beschleunigen. Lesen Sie weiter und erfahren Sie alles über die String-Ausdrücke, die Sie kennen sollten, um die Attributfilterung mit String-Daten durchzuführen.

Wir wissen jetzt, dass der String-Datentyp extrem nützlich ist, aber wann genau müssen wir diesen Datentyp bei der Erstellung unserer eigenen Anwendungen verwenden? Im Folgenden sehen Sie einige Code-Beispiele für Szenarien, die String-Daten beinhalten können, die Ihnen ein besseres Verständnis für die Verwaltung von VARCHAR-Daten in Milvus 2.1 vermitteln.

Erstellen Sie eine Sammlung

Lassen Sie uns dem vorherigen Beispiel folgen. Sie arbeiten immer noch an dem Buchempfehlungssystem und möchten eine Buchsammlung mit einem Primärschlüsselfeld namens book_name erstellen, in das Sie Zeichenkettendaten einfügen werden. In diesem Fall können Sie den Datentyp als DataType.VARCHARfestlegen, wenn Sie das Feldschema einstellen, wie im folgenden Beispiel gezeigt.

Beachten Sie, dass Sie bei der Erstellung eines VARCHAR-Feldes die maximale Zeichenlänge über den Parameter max_length angeben müssen, dessen Wert zwischen 1 und 65.535 liegen kann. In diesem Beispiel haben wir die maximale Länge auf 200 festgelegt.

from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
  name="book_id", 
  dtype=DataType.INT64, 
)
book_name = FieldSchema( 
  name="book_name", 
  dtype=DataType.VARCHAR, 
  max_length=200, 
  is_primary=True, 
)
word_count = FieldSchema(
  name="word_count", 
  dtype=DataType.INT64,  
)
book_intro = FieldSchema(
  name="book_intro", 
  dtype=DataType.FLOAT_VECTOR, 
  dim=2
)
schema = CollectionSchema(
  fields=[book_id, word_count, book_intro], 
  description="Test book search"
)
collection_name = "book"

Daten einfügen

Nun, da die Sammlung erstellt ist, können wir Daten in sie einfügen. Im folgenden Beispiel fügen wir 2.000 Zeilen mit zufällig generierten Zeichenketten ein.

import random
data = [
  [i for i in range(2000)],
  ["book_" + str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
]

Daten löschen

Angenommen, zwei Bücher mit den Namen book_0 und book_1 sind in Ihrem Shop nicht mehr verfügbar, so dass Sie die entsprechenden Informationen aus Ihrer Datenbank löschen möchten. In diesem Fall können Sie den Termausdruck in verwenden, um die zu löschenden Entitäten zu filtern, wie im folgenden Beispiel gezeigt.

Denken Sie daran, dass Milvus nur das Löschen von Entitäten mit eindeutig spezifizierten Primärschlüsseln unterstützt. Bevor Sie also den folgenden Code ausführen, stellen Sie sicher, dass Sie das Feld book_name als Primärschlüsselfeld festgelegt haben.

expr = "book_name in [\"book_0\", \"book_1\"]" 
from pymilvus import Collection
collection = Collection("book")     
collection.delete(expr)

Einen Index erstellen

Milvus 2.1 unterstützt den Aufbau von skalaren Indizes, was die Filterung von String-Feldern erheblich beschleunigt. Im Gegensatz zur Erstellung eines Vektorindexes müssen Sie vor der Erstellung eines skalaren Indexes keine Parameter vorbereiten. Milvus unterstützt vorübergehend nur den Dictionary Tree (MARISA-trie) Index, so dass der Indextyp eines VARCHAR-Feldes standardmäßig MARISA-trie ist.

Sie können den Indexnamen beim Erstellen des Indexes angeben. Wenn er nicht angegeben wird, lautet der Standardwert von index_name "_default_idx_" . Im folgenden Beispiel haben wir den Index scalar_index genannt.

from pymilvus import Collection
collection = Collection("book")   
collection.create_index(
  field_name="book_name", 
  index_name="scalar_index",
)

Durch die Angabe von booleschen Ausdrücken können Sie die String-Felder während einer Vektorähnlichkeitssuche filtern.

Wenn Sie beispielsweise nach Büchern suchen, deren Intro Hello Milvus am ähnlichsten ist, aber nur die Bücher erhalten möchten, deren Namen mit "book_2" beginnen, können Sie den Operator likeverwenden, um eine Präfix-Übereinstimmung durchzuführen und die gewünschten Bücher zu erhalten, wie im folgenden Beispiel gezeigt.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "limit": 2,
  "expr": "book_name like \"Hello%\"",
}
res = collection.search(**search_param)

String-Ausdrücke

Neben dem neu hinzugefügten Operator like können auch andere Operatoren, die bereits in früheren Versionen von Milvus unterstützt wurden, für die Filterung von Stringfeldern verwendet werden. Im Folgenden finden Sie einige Beispiele für häufig verwendete String-Ausdrücke, wobei A ein Feld vom Typ VARCHAR darstellt. Denken Sie daran, dass alle unten aufgeführten String-Ausdrücke mit logischen Operatoren wie AND, OR und NOT logisch kombiniert werden können.

Mengenoperationen

Sie können in und not in verwenden, um Mengenoperationen zu realisieren, wie z. B. A in ["str1", "str2"].

Vergleich zweier Stringfelder

Sie können relationale Operatoren verwenden, um die Werte von zwei Stringfeldern zu vergleichen. Solche relationalen Operatoren sind ==, !=, >, >=, <, <=. Weitere Informationen finden Sie unter Relationale Operatoren.

Beachten Sie, dass Zeichenfolgenfelder nur mit anderen Zeichenfolgenfeldern und nicht mit Feldern anderer Datentypen verglichen werden können. Zum Beispiel kann ein Feld vom Typ VARCHAR nicht mit einem Feld vom Typ Boolean oder vom Typ Integer verglichen werden.

Vergleich eines Felds mit einem konstanten Wert

Sie können == oder != verwenden, um zu überprüfen, ob der Wert eines Felds gleich einem konstanten Wert ist.

Filtern von Feldern mit einem einzigen Bereich

Sie können >, >=, <, <= verwenden, um Zeichenkettenfelder mit einem einzigen Bereich zu filtern, z. B. A > "str1".

Präfix-Abgleich

Wie bereits erwähnt, fügt Milvus 2.1 den Operator like für den Präfixabgleich hinzu, z. B. A like "prefix%".

Was kommt als Nächstes?

Mit der offiziellen Freigabe von Milvus 2.1 haben wir eine Reihe von Blogs vorbereitet, in denen die neuen Funktionen vorgestellt werden. Lesen Sie mehr in dieser Blogserie:

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Weiterlesen