Eseguire Query Condizionali

Questo argomento introduce come eseguire query condizionali, simili alle condizioni SQL WHERE.

A differenza della ricerca di similarità vettoriale, le query recuperano vettori basati su filtraggio scalare utilizzando espressioni booleane. Milvus supporta vari tipi di dati nei campi scalari e una varietà di espressioni booleane. Le espressioni booleane possono filtrare campi scalari o campi chiave primaria e recuperare tutti i risultati corrispondenti alle condizioni di filtro.

Nell'esempio seguente si illustra come eseguire una query su un set di dati contenente 2000 righe, tra cui ID del libro (chiave primaria), conteggio delle parole (campo scalare) e introduzione del libro (campo vettoriale). Si simula la ricerca di libri specifici in base ai loro ID.

Caricamento della Collezione

In Milvus, tutte le operazioni di ricerca e query vengono eseguite in memoria. Prima di eseguire una query, è necessario caricare la collezione in memoria.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("Impossibile caricare la collezione:", err.Error())
}

Esecuzione della Query

Nell'esempio seguente vengono filtrati i vettori in base a valori specifici di book_id e vengono restituiti i campi book_id e book_intro dei risultati.

Milvus supporta l'impostazione di livelli di consistenza per le query. In questo esempio si imposta il livello di consistenza su Strong. È inoltre possibile impostare il livello di consistenza su Bounded, Session o Eventually. Per maggiori informazioni sui quattro livelli di consistenza in Milvus, fare riferimento a Consistenza.

È inoltre possibile utilizzare campi dinamici nelle espressioni di filtro e campi di output nella richiesta di query. Ad esempio, fare riferimento al modello dinamico.

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

queryResult, err := milvusClient.Query(
    context.Background(),                                   // ctx
    "book",                                                 // CollectionName
    "",                                                     // PartitionName
    entity.NewColumnInt64("book_id", []int64{2,4,6,8}),     // expr
    []string{"book_id", "book_intro"},                      // OutputFields
    opt,                                                    // queryOptions
)
if err != nil {
    log.Fatal("Impossibile eseguire la query sulla collezione:", err.Error())
}
Parametro Descrizione Opzioni
ctx Contesto utilizzato per controllare il processo di chiamata API. N/D
CollectionName Nome della collezione da interrogare. N/D
partitionName Nomi delle partizioni da caricare. Se vuoto, interroga tutte le partizioni. N/D
expr Espressione booleana utilizzata per filtrare attributi. Per ulteriori informazioni, vedere Regole delle espressioni booleane.
OutputFields Nomi dei campi da restituire. I campi vettoriali non sono supportati nella versione attuale.
opts Opzioni di query rappresentate sotto forma di entity.SearchQueryOptionFunc. - Limit indica il numero di entità da restituire. - Offset indica il numero di entità da saltare durante il processo di ricerca. La somma di questo parametro e Limit dovrebbe essere inferiore a 16384. - ConsistencyLevel indica il livello di consistenza da applicare durante il processo di ricerca. - Ignore Growing indica se ignorare il segmento in crescita durante il processo di ricerca di similarità. Il valore predefinito è False, indicando che la ricerca coinvolge il segmento in crescita.

Verificare il risultato restituito.

fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
    fmt.Println(qr.IDs)
}

Calcolo della Quantità di Entità

Quando si esegue una query, è possibile aggiungere count(*) ai output_fields, in modo che Milvus possa restituire la quantità di entità nella collezione. Se si desidera contare la quantità di entità che soddisfano condizioni specifiche, utilizzare expr per definire un'espressione booleana.

Limitazioni

Nell'utilizzo di count(*) nei output_fields, non è consentito l'uso del parametro limit.