Milvus-Hybridsuche

Milvus Hybridsuche



In Milvus ist eine Hybridsuche eine Vektorsuche, die die Attributfilterung beinhaltet. Durch die Verwendung bestimmter boolescher Ausdrücke zum Filtern entweder der Skalarfelder oder des Primärschlüsselfelds können Sie bestimmte Bedingungen anwenden, um Ihre Suche einzugrenzen.

In diesem Tutorial wird gezeigt, wie Sie mithilfe der PyMilvus-API eine einfache Hybridsuche in Milvus durchführen.

Anforderungen:

Um die bereitgestellten Methoden und den Code in diesem Beitrag verwenden zu können, stellen Sie sicher, dass Sie über Folgendes verfügen:







  1. Zugriff auf einen Milvus-Server
  2. Python 3.10+ und höher
  3. PyMilvus installiert

Wenn die gegebenen Voraussetzungen erfüllt sind, können wir mit dem Tutorial fortfahren.



Erstellen Sie eine Sammlung

Bevor wir uns mit der Durchführung einer Hybridsuche in Milvus befassen, beginnen wir mit der Einrichtung einer Basissammlung zu Demonstrationszwecken.



Wir können dies tun, indem wir die erforderlichen Sammlungsparameter wie das Feldschema, das Sammlungsschema und den Sammlungsnamen einrichten.





Wir verwenden die Milvus Python API, um eine primäre Sammlung zum Speichern der Filminformationen zu erstellen. Denken Sie daran, dass es sich hierbei um Demodaten handelt und keine realen Daten oder Schemakonfigurationen darstellen.

aus Pymilvus importieren CollectionSchema , FieldSchema , Datentyp

movie_id = FieldSchema (

Name = „movie_id“ ,

dtype = Datentyp. INT64 ,

is_primary = WAHR ,

)

Filmtitel = FieldSchema (

Name = 'Filmtitel' ,

dtype = Datentyp. VARCHAR ,

maximale Länge = 200 ,

)

Regisseur = FieldSchema (

Name = 'Regisseur' ,

dtype = Datentyp. VARCHAR ,

maximale Länge = 100 ,

)

film_release_year = FieldSchema (

Name = „film_release_year“ ,

dtype = Datentyp. INT64 ,

)

Filmgenre = FieldSchema (

Name = 'Filmgenre' ,

dtype = Datentyp. VARCHAR ,

maximale Länge = fünfzig ,

)

movie_intro = FieldSchema (

Name = „film_intro“ ,

dtype = Datentyp. FLOAT_VECTOR ,

schwach = 2

)

Schema = CollectionSchema (

Felder = [ movie_id , Filmtitel , Regisseur , film_release_year , Filmgenre , movie_intro ] ,

Beschreibung = „Filmsuche“ ,

enable_dynamic_field = WAHR

)

Sammlungsname = 'Film'

Im vorherigen Beispiel wird das PyMilvus SDK verwendet, um ein grundlegendes Sammlungsschema mit den definierten Parametern einzurichten. Dies enthält Felder wie „film_id“, „film_title“, „film_release_year“ usw.



Sobald wir fertig sind, können wir die Sammlung mit dem vorherigen Schema erstellen. Der Code lautet wie folgt:

aus Pymilvus importieren Sammlung

Sammlung = Sammlung (

Name = Sammlungsname ,

Schema = Schema ,

verwenden = 'Standard' ,

shards_num = 2

)

Nach der Erstellung können wir die Methode „collection.insert()“ verwenden, um die Beispieldaten in die Sammlung einzufügen, wie in der folgenden Definition gezeigt:

movie_date = [

{

„movie_id“ : 1 ,

'Filmtitel' : 'Beginn' ,

'Regisseur' : 'Christopher nolan' ,

„film_release_year“ : 2010 ,

'Filmgenre' : 'Science-Fiction' ,

„film_intro“ : [ 0,1 , 0,5 ] , # Beispiel-Float-Vektor

} ,

{

„movie_id“ : 2 ,

'Filmtitel' : „Die Shawshank-Erlösung“ ,

'Regisseur' : „Frank Darabont“ ,

„film_release_year“ : 1994 ,

'Filmgenre' : 'Theater' ,

„film_intro“ : [ 0,2 , 0,7 ] , # Beispiel-Float-Vektor

} ,

]

Um die Daten einzufügen, stellen Sie eine Verbindung zum Milvus-Server her und rufen Sie die Methode insert() wie folgt auf:

Sammlung = Sammlung ( 'Film' )
Herr = Sammlung. einfügen ( movie_date )

Dadurch sollten die zuvor definierten „film_data“ in die Filmsammlung eingefügt werden.

Laden Sie die Sammlung

Bevor wir die in der Sammlung gespeicherten Daten durchsuchen, müssen wir die Sammlung von der Systemfestplatte in den Systemspeicher laden. Weitere Informationen finden Sie in unserem Tutorial zur Milvus Load Collection.

Zunächst verwenden wir das PyMilvus SDK, um die Filmsammlung wie folgt in den Systemspeicher zu laden:

aus Pymilvus importieren Sammlung

Sammlung = Sammlung ( 'Film' )

Sammlung. Belastung ( )

Dadurch sollte die Sammlung verfügbar sein, die es uns ermöglicht, die Zielsuchen auf dem Server durchzuführen, wie wir in den folgenden Schritten demonstrieren.

Milvus-Hybridsuche

Schließlich können wir eine Hybridsuche durchführen. Beginnen wir damit, zu definieren, was genau eine Milvus-Hybridsuche ist.

In Milvus ist eine Hybridsuche eine Suchtechnik, die die Vektorsuche mit der Attributfilterung kombiniert. Dieser Ansatz ermöglicht uns eine Suche basierend auf Vektorähnlichkeiten und spezifischen Attributbedingungen.

Indem wir die booleschen Ausdrücke zum Filtern der Skalarfelder oder des Primärschlüsselfelds anwenden, können wir die Suche so einschränken, dass sie die angegebenen Bedingungen erfüllt.

Daher führen wir mithilfe einer Hybridsuche in Milvus die Vielseitigkeit und Präzision ein, indem wir die Vektordarstellung und attributbasierte Filterung in einer einzigen Abfrage nutzen.

NOTIZ: Milvus kann von uns verlangen, einen Index für die Sammlung der Felder zu erstellen, die wir durchsuchen möchten. In unserem Beispiel können wir wie folgt einen Index für das Feld „film_intro“ erstellen:

von Pymilvus importieren Sammlung

Sammlung = Sammlung ( 'Film' )

index_params = {
„index_type“ : „IVF_FLAT“ ,
„metric_type“ : „L2“ ,
„Parameter“ : {
„nart“ : 2
}
}

Sammlung. create_index (
Feldname = „film_intro“ ,
index_params = index_params ,
Indexname = „intro_index“
)

Um auch einen Index für „release_year“ zu erstellen, können wir den Code wie folgt ausführen:

aus Pymilvus importieren Sammlung
Sammlung = Sammlung ( 'Film' )
Sammlung. create_index (
Feldname = „film_release_year“ ,

Indexname = „year_index“
)

Beispiel für eine Milvus-Hybridsuche:

Lassen Sie uns demonstrieren, wie wir eine Vektor-Hybridsuche durchführen können, indem wir einen booleschen Ausdruck angeben, um das Skalarfeld der Entitäten zu filtern.

Betrachten Sie das folgende Beispiel:

search_param = {
'Daten' : [ [ 0,1 , 0,2 ] ] ,
„anns_field“ : „film_intro“ ,
„param“ : { „metric_type“ : „L2“ , „Parameter“ : { „nprobe“ : 10 } , „Offset“ : 0 } ,
'Grenze' : 10 ,
„expr“ : „film_release_year <= 2000“ ,
}
res = Sammlung. suchen ( **search_param )
drucken ( res )

In diesem Fall führen wir eine Hybridsuche durch, indem wir einen booleschen Ausdruck angeben, der mit dem Wert übereinstimmt, bei dem „film_release_year“ kleiner oder gleich 2000 ist.

Sobald wir den vorherigen Code ausführen, sollten wir die Ausgabe wie folgt erhalten:

[ „['id: 2, Abstand: 0,25999999046325684, Entität: {}']“ ]

In diesem Fall hat der übereinstimmende Wert eine ID von 2, wie in der zweiten Entität und der Entfernung definiert.

Vollständiger Quellcode:

Im Folgenden wird der vollständige Quellcode angezeigt, der in diesem Beitrag verwendet wird, einschließlich der Schemaerstellung, der Dateneinfügung und der Hybridsuche.

aus Pymilvus importieren CollectionSchema , FieldSchema , Datentyp , Sammlung , Verbindungen

Verbindungen. verbinden (

alias = 'Standard' ,

Gastgeber = 'localhost' ,

Hafen = '19530'

)

movie_id = FieldSchema (

Name = „movie_id“ ,

dtype = Datentyp. INT64 ,

is_primary = WAHR ,

)

Filmtitel = FieldSchema (

Name = 'Filmtitel' ,

dtype = Datentyp. VARCHAR ,

maximale Länge = 200 ,

)

Regisseur = FieldSchema (

Name = 'Regisseur' ,

dtype = Datentyp. VARCHAR ,

maximale Länge = 100 ,

)

film_release_year = FieldSchema (

Name = „film_release_year“ ,

dtype = Datentyp. INT64 ,

)

Filmgenre = FieldSchema (

Name = 'Filmgenre' ,

dtype = Datentyp. VARCHAR ,

maximale Länge = fünfzig ,

)

movie_intro = FieldSchema (

Name = „film_intro“ ,

dtype = Datentyp. FLOAT_VECTOR ,

schwach = 2

)

Schema = CollectionSchema (

Felder = [ movie_id , Filmtitel , Regisseur , film_release_year , Filmgenre , movie_intro ] ,

Beschreibung = „Filmsuche“ ,

enable_dynamic_field = WAHR

)

Sammlungsname = 'Film'

Sammlung = Sammlung (

Name = Sammlungsname ,

Schema = Schema ,

verwenden = 'Standard' ,

shards_num = 2

)

movie_date = [

{

„movie_id“ : 1 ,

'Filmtitel' : 'Beginn' ,

'Regisseur' : 'Christopher nolan' ,

„film_release_year“ : 2010 ,

'Filmgenre' : 'Science-Fiction' ,

„film_intro“ : [ 0,1 , 0,5 ] , # Beispiel-Float-Vektor

} ,

{

„movie_id“ : 2 ,

'Filmtitel' : „Die Shawshank-Erlösung“ ,

'Regisseur' : „Frank Darabont“ ,

„film_release_year“ : 1994 ,

'Filmgenre' : 'Theater' ,

„film_intro“ : [ 0,2 , 0,7 ] , # Beispiel-Float-Vektor

} ,

]

Sammlung = Sammlung ( 'Film' )

Herr = Sammlung. einfügen ( movie_date )

Sammlung = Sammlung ( 'Film' )

Sammlung. Belastung ( )

search_param = {

'Daten' : [ [ 0,1 , 0,2 ] ] ,

„anns_field“ : „film_intro“ ,

„param“ : { „metric_type“ : „L2“ , „Parameter“ : { „nprobe“ : 10 } , „Offset“ : 0 } ,

'Grenze' : 10 ,

„expr“ : „film_release_year <= 2000“ ,

}

res = Sammlung. suchen ( **search_param )

drucken ( res )

Abschluss

Wir haben die Funktionsweise von Milvus erkundet, indem wir etwas über die Hybridsuche gelernt haben. Außerdem haben wir anhand praktischer Beispiele demonstriert, wie man Schemata erstellt, Daten hinzufügt und die booleschen Ausdrücke für ein bestimmtes Entitätsfeld angibt, um wie gewünscht eine Hybridsuche durchzuführen.