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