Vektorsimilaritätssuche
In diesem Artikel wird erläutert, wie man in Milvus eine Entitätssuche durchführt.
Die Vektorsimilaritätssuche in Milvus berechnet die Entfernung zwischen dem Abfragevektor und den Vektoren in der Sammlung und gibt die ähnlichsten Ergebnisse zurück. Es ist auch möglich, eine gemischte Suche durchzuführen, indem man einen Booleschen Ausdruck angibt, um skalare Felder oder Primärschlüsselfelder zu filtern.
Im folgenden Beispiel wird gezeigt, wie man eine Vektorsimilaritätssuche in einem Datensatz mit 2000 Zeilen durchführt, bestehend aus Buch-IDs (Primärschlüssel), Wortfrequenz (skalares Feld) und Buchbeschreibungen (Vektorfeld). Dies simuliert das Szenario der Suche nach spezifischen Büchern anhand vektorisierter Beschreibungen. Milvus gibt die ähnlichsten Ergebnisse basierend auf Ihrem definierten Abfragevektor und den Suchparametern zurück.
Sammlung laden
Bevor die Vektorsimilaritätssuche durchgeführt wird, führt Milvus alle Such- und Abfrageoperationen im Speicher aus. Bitte laden Sie die Sammlung in den Speicher, bevor Sie die Vektorsimilaritätssuche durchführen.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("Fehler beim Laden der Sammlung:", err.Error())
}
Suchparameter vorbereiten
Bereiten Sie Parameter vor, die für Ihr Suchszenario geeignet sind. Im folgenden Beispiel wird definiert, den euklidischen Abstand zu berechnen und Vektoren aus den zehn nächstgelegenen Clustern, die vom IVF_FLAT-Index erstellt wurden, abzurufen.
sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Parameter | Beschreibung | Optionen |
---|---|---|
NewIndex*SearchParam func |
Funktion zum Erstellen von entity.SearchParam basierend auf verschiedenen Indextypen. |
Für Float-Vektoren: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Für Binär-Vektoren: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Indexspezifische Suchparameter, die von der vorherigen Funktion zurückgegeben wurden. | Siehe Vektorindex für Details. |
opt |
Optionen für ANN-Suche. | - Limit : Geben Sie die Anzahl der zurückzugebenden Entitäten an. - Offset : Geben Sie die Anzahl der während der Suche zu überspringenden Entitäten an. Die Summe dieses Parameters und von Limit sollte kleiner als 16384 sein. Wenn Sie beispielsweise die 9. und 10. nächstgelegenen Nachbarn eines Vektors abfragen möchten, setzen Sie Limit auf 2 und Offset auf 8 . - ConsistencyLevel : Geben Sie den Konsistenzgrad an, der während der Suche angewendet wird. - Growing ignorieren : Gibt an, ob beim Ähnlichkeitssuchen wachsende Segmente ignoriert werden sollen. Der Standardwert ist False , was bedeutet, dass die Suche wachsende Segmente umfasst. |
Durchführen einer Vektorsuche
Führen Sie eine Vektorsuche mit Milvus durch. Um in einem bestimmten Partition zu suchen, geben Sie bitte die Partitionsnamenliste an.
Milvus unterstützt die Einstellung eines Konsistenzniveaus für die Suche. Das folgende Beispiel setzt das Konsistenzniveau auf "Stark". Sie können das Konsistenzniveau auch auf "Begrenzt", "Session" oder "Schließlich" setzen. Weitere Informationen zu den vier Konsistenzniveaus in Milvus finden Sie unter Konsistenz.
searchResult, err := milvusClient.Search(
context.Background(), // ctx
"book", // CollectionName
[]string{}, // partitionNames
"", // expr
[]string{"book_id"}, // outputFields
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
"book_intro", // vectorField
entity.L2, // metricType
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("Fehler bei der Suche in der Sammlung:", err.Error())
}
Parameter | Beschreibung | Optionen |
---|---|---|
ctx |
Kontext zur Steuerung des API-Aufrufprozesses | Nicht zutreffend |
CollectionName |
Name der zu ladenden Sammlung | Nicht zutreffend |
partitionNames |
Liste der zu ladenden Partitionsnamen. Wenn leer, in allen Partitionen suchen | Nicht zutreffend |
expr |
Boolescher Ausdruck zur Filterung von Eigenschaften | Siehe Boolesche Ausdrucksregeln für detaillierte Informationen |
output_fields |
Namen der zurückzugebenden Felder | Nicht zutreffend |
vectors |
Zu suchende Vektoren | Nicht zutreffend |
vectorField |
Name des zu suchenden Felds | Nicht zutreffend |
metricType |
Verwendeter Metriktyp für die Suche | Dieser Parameter muss der gleiche Metriktyp sein, der zum Aufbau des Index verwendet wurde |
topK |
Anzahl der zurückzugebenden Ergebnisse. Die Summe dieses Werts und offset in opts sollte weniger als 16384 betragen |
Nicht zutreffend |
sp |
entity.SearchParam spezifisch für den Index |
Nicht zutreffend |
Überprüfen Sie die Primärschlüsselwerte und die Entfernungen der ähnlichsten Vektoren.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
Nach Abschluss der Suche entladen Sie die in Milvus geladene Sammlung, um den Speicherverbrauch zu reduzieren.
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // CollectionName
)
if err != nil {
log.Fatal("Fehler bei der Freigabe der Sammlung:", err.Error())
}
Einschränkungen
Feature | Maximale Grenze |
---|---|
Länge des Sammlungsnamens | 255 Zeichen |
Anzahl der Partitionen in einer Sammlung | 4.096 |
Anzahl der Felder in einer Sammlung | 256 |
Anzahl der Shards in einer Sammlung | 256 |
Dimensionalität von Vektoren | 32.768 |
Top K | 16.384 |
Anzahl der Zielfeld-Eingabevektoren | 16.384 |
Durchführung einer gemischten Suche
Eine gemischte Suche ist grundsätzlich eine Vektorsuche mit Attributfilterung. Durch Angabe eines booleschen Ausdrucks zur Filterung skalaren Felder oder Primärschlüsselfelder können Sie die Suche basierend auf spezifischen Bedingungen einschränken.
Das folgende Beispiel zeigt, wie eine gemischte Suche basierend auf einer regulären Vektorsuche durchgeführt wird. Angenommen, Sie möchten nach bestimmten Büchern anhand der vektorisierten Einleitung der Bücher suchen, aber nur Bücher innerhalb eines bestimmten Wortanzahlbereichs abrufen. Sie können dann das Feld word_count
filtern, indem Sie in den Suchparametern einen booleschen Ausdruck angeben. Milvus sucht dann nur nach ähnlichen Vektoren innerhalb von Entitäten, die dem Ausdruck entsprechen.
sp, _ := entity.NewIndexFlatSearchParam(
10,
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
searchResult, err := milvusClient.Search(
context.Background(),
"book",
[]string{},
"word_count <= 11000",
[]string{"book_id"},
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
"book_intro",
entity.L2,
2,
sp,
opt,
)
if err != nil {
log.Fatal("Fehler bei der Suche in der Sammlung:", err.Error())
}
Überprüfen Sie die zurückgegebenen Ergebnisse.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}