Ricerca di similarità vettoriale
Questo argomento introduce come eseguire la ricerca di entità in Milvus.
La ricerca di similarità vettoriale in Milvus calcola la distanza tra il vettore di interrogazione e i vettori nella collezione, restituendo i risultati più simili. È anche possibile eseguire una ricerca mista specificando un' espressione booleana per filtrare campi scalari o campi chiave primaria.
Il seguente esempio dimostra come eseguire la ricerca di similarità vettoriale su un dataset di 2000 righe, composto da ID dei libri (chiave primaria), frequenza delle parole (campo scalare), e descrizioni dei libri (campo vettoriale). Questo simula lo scenario di ricerca di libri specifici basati su descrizioni vettoriali. Milvus restituirà i risultati più simili in base al vettore di query definito e ai parametri di ricerca.
Caricamento della Collezione
Prima di eseguire la ricerca di similarità vettoriale, Milvus esegue tutte le operazioni di ricerca e interrogazione in memoria. Si prega di caricare la collezione in memoria prima di eseguire la ricerca di similarità vettoriale.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("caricamento della collezione non riuscito:", err.Error())
}
Preparare i Parametri di Ricerca
Preparare i parametri adatti al vostro scenario di ricerca. L'esempio seguente definisce l'utilizzo della distanza euclidea per calcolare la distanza e il recupero dei vettori dai dieci cluster più vicini costruiti dall'indice IVF_FLAT.
sp, _ := entity.NewIndexIvfFlatSearchParam( // Funzione NewIndex*SearchParam
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Parametro | Descrizione | Opzioni |
---|---|---|
NewIndex*SearchParam func |
Funzione per creare entity.SearchParam basata su diversi tipi di indice. |
Per vettori float: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Per vettori binari: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Parametri di ricerca specifici dell'indice restituiti dalla funzione precedente. | Consultare l'Indice Vettoriale per i dettagli. |
opt |
Opzioni per la ricerca ANN. | - Limit : Specifica il numero di entità da restituire. - Offset : Specifica il numero di entità da saltare durante la ricerca. La somma di questo parametro e Limit dovrebbe essere inferiore a 16384. Ad esempio, se si desidera interrogare il 9° e il 10° vicino più prossimo di un vettore, impostare Limit su 2 e Offset su 8 . - ConsistencyLevel : Specifica il livello di coerenza applicato durante la ricerca. - Ignore Growing : Indica se ignorare i segmenti in crescita nella ricerca di similarità. Il valore predefinito è False , indicando che la ricerca coinvolge segmenti in crescita. |
Esegui la Ricerca Vettoriale
Esegui la ricerca vettoriale utilizzando Milvus. Per cercare in una partizione specifica, specifica l'elenco dei nomi delle partizioni.
Milvus supporta l'impostazione di un livello di coerenza per la ricerca. Nell'esempio di questo argomento, il livello di coerenza viene impostato su Strong
. È anche possibile impostare il livello di coerenza su Bounded
, Session
o Eventually
. Per ulteriori informazioni sui quattro livelli di coerenza in Milvus, consulta la Coerenza.
searchResult, err := milvusClient.Search(
context.Background(), // ctx
"book", // NomeCollezione
[]string{}, // nomiPartizioni
"", // expr
[]string{"book_id"}, // campiOutput
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vettori
"book_intro", // campoVettore
entity.L2, // tipoMetrica
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("Impossibile cercare nella collezione:", err.Error())
}
Parametro | Descrizione | Opzioni |
---|---|---|
ctx |
Contesto utilizzato per controllare il processo di chiamata API | N/D |
NomeCollezione |
Nome della collezione da caricare | N/D |
nomiPartizioni |
Elenco dei nomi delle partizioni da caricare. Se vuoto, cerca in tutte le partizioni | N/D |
expr |
Espressione booleana per filtrare le proprietà | Consulta le regole sull'Espressione Booleana per informazioni dettagliate |
campiOutput |
Nomi dei campi da restituire | N/D |
vettori |
Vettori da cercare | N/D |
campoVettore |
Nome del campo da cercare | N/D |
tipoMetrica |
Tipo di metrica utilizzato per la ricerca | Questo parametro deve essere lo stesso del tipo di metrica utilizzato per la costruzione dell'indice |
topK |
Numero di risultati da restituire. La somma di questo valore e offset in opts deve essere inferiore a 16384 |
N/D |
sp |
entity.SearchParam specifico per l'indice |
N/D |
Controlla i valori della chiave primaria e le distanze dei vettori più simili.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
Dopo il completamento della ricerca, rilascia la collezione caricata in Milvus per ridurre il consumo di memoria.
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // NomeCollezione
)
if err != nil {
log.Fatal("Impossibile rilasciare la collezione:", err.Error())
}
Limitazioni
Funzionalità | Limite Massimo |
---|---|
Lunghezza del nome della collezione | 255 caratteri |
Numero di partizioni in una collezione | 4.096 |
Numero di campi in una collezione | 256 |
Numero di shard in una collezione | 256 |
Dimensione dei vettori | 32.768 |
Top K | 16.384 |
Numero di vettori di input di destinazione | 16.384 |
Eseguire una Ricerca Mista
La ricerca mista è essenzialmente una ricerca vettoriale con filtraggio degli attributi. Specificando un'espressione booleana per filtrare i campi scalari o i campi chiave primaria, è possibile limitare la ricerca in base a condizioni specifiche.
Nell'esempio seguente viene mostrato come eseguire una ricerca mista basata su una normale ricerca vettoriale. Supponiamo di voler cercare libri specifici in base all'introduzione vettorializzata dei libri, ma si desidera recuperare solo i libri all'interno di un determinato intervallo di conteggio delle parole. È quindi possibile filtrare il campo word_count
specificando un'espressione booleana nei parametri di ricerca. Milvus cercherà solo vettori simili all'interno delle entità che corrispondono all'espressione.
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("Impossibile cercare nella collezione:", err.Error())
}
Controlla i risultati restituiti.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}