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