Le query vettoriali funzionano cercando in un database vettoriale i vettori che corrispondono meglio al vettore di query nell'intero cluster. Questa pagina fornisce dettagli su come funziona.
Trovare vettori simili
Le query di ricerca vettoriale utilizzano due strategie:
- K-Nearest Neighbors (KNN): trova i k vettori più vicini al vettore di query.
- Approximate Nearest Neighbors (ANN): trova i k vettori più vicini approssimativi al vettore di query.
Per utilizzare KNN, gli indici devono essere creati con il tipo di indice vettoriale FLAT. Con KNN, le query di ricerca saranno esatte, ma più lente. Per utilizzare ANN, gli indici devono essere creati con il tipo di indice vettoriale HNSW. Con ANN, le query di ricerca saranno approssimative, ma più veloci. La precisione di ANN può essere migliorata modificando i parametri dell'indice HNSW e il parametro EF_RUNTIME nella query.
Analisi della sintassi delle query
FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
index: il nome dell'indice contenente il campo vettoriale.(hybrid_filter_expression): questa è l'espressione di filtro ibrida. Nelle espressioni di filtro sono supportati solo gli indici di tag e numerici. Per ulteriori dettagli sulle espressioni di filtro, consulta Query ibride.- Puoi utilizzare
(*)per eseguire query che non richiedono il filtraggio.
- Puoi utilizzare
=>: separa il filtro dall'espressione di ricerca vettoriale.[KNN num_neighbours @field $vector]: l'espressione di ricerca KNN. Sostituiscinum_neighborscon il numero di risultati scelto e@fieldcon il nome del campo vettoriale.PARAMS 2 my_vector_query_param "query_embedding":- Il valore
2dopoPARAMSindica che devono essere forniti due argomenti aggiuntivi. my_vector_query_paramè il nome del vettore del parametro di query, come specificato nell'espressione di ricerca KNN.- Sostituisci
query_embeddingcon il vettore di query incorporato.
- Il valore
DIALECT 2: specifica che stai utilizzando la versione 2 o successive del dialetto di query (obbligatorio per la ricerca vettoriale).
Query ibride
L'espressione iniziale racchiusa tra parentesi () è un'espressione di filtro. Le espressioni di filtro consentono di filtrare i vettori durante l'esecuzione dell'espressione di ricerca vettoriale. Una query che utilizza un'espressione di filtro per filtrare i risultati è chiamata query ibrida. Qualsiasi combinazione di indici di tag e numerici può formare una query ibrida.
Memorystore for Redis Cluster utilizza due approcci per filtrare le espressioni di ricerca vettoriale:
- Prefiltraggio: il prefiltraggio si basa su indici secondari (ad es. tag, numerici) per trovare prima le corrispondenze con l'espressione di filtro, indipendentemente dalla somiglianza del vettore. Una volta calcolati i risultati filtrati, viene eseguita una ricerca di forza bruta per ordinare in base alla somiglianza del vettore.
- Filtraggio in linea: il filtraggio in linea esegue l'algoritmo di ricerca vettoriale (ad es. HNSW), ignorando i vettori trovati che non corrispondono al filtro.
Il prefiltraggio è più veloce quando lo spazio di ricerca filtrato è molto più piccolo dello spazio di ricerca originale. Quando lo spazio di ricerca filtrato è grande, il filtraggio in linea diventa più veloce. Memorystore for Redis Cluster sceglie automaticamente tra le due strategie in base al filtro fornito.
Le espressioni di filtro supportano sia gli indici di tag sia quelli numerici.
Indice di tag
I tag sono campi di testo interpretati come un elenco di tag delimitati da un carattere separatore. In genere, i tag sono piccoli insiemi di valori con valori possibili finiti, come colore, genere di libro, nome della città o autore.
- Solo i campi indicizzati possono essere utilizzati come filtro di tag.
- I campi TAG sono tokenizzati da un carattere separatore, che per impostazione predefinita è una virgola "," ma può essere configurato durante la creazione dell'indice.
- Durante l'indicizzazione di un campo tag non viene eseguito lo stemming.
- Su un campo tag possono essere eseguiti solo filtri di prefisso e filtri esatti. Le query di suffisso e infisso non sono supportate.
- Per impostazione predefinita, i tag non fanno distinzione tra maiuscole e minuscole. Ad esempio, "Blue" e "BLUE" verranno indicizzati come "blue" e produrranno lo stesso risultato in una query ibrida.
- Le stringhe vuote non vengono indicizzate né sottoposte a query.
- Durante l'indicizzazione e l'esecuzione di query, gli spazi vuoti finali vengono rimossi.
Sintassi
Qui { e } fanno parte della sintassi e | viene utilizzato come operatore OR per supportare più tag:
@:{ | | ...}
Ad esempio, la seguente query restituirà i documenti con colore blu, nero o verde.
@color:{blue | black | green}
Come altro esempio, la seguente query restituirà i documenti contenenti "hello world" o "hello universe".
@color:{hello world | hello universe}
Indice numerico
Gli indici numerici consentono di filtrare le query in modo da restituire solo i valori compresi tra un valore iniziale e un valore finale specificati.
- Sono supportate sia le query inclusive sia quelle esclusive.
- Per le query a risposta aperta, è possibile utilizzare +inf e -inf per esprimere gli intervalli di inizio e fine.
Ad esempio, la seguente query restituirà i libri pubblicati tra il 2021 e il 2024 (inclusi). L'espressione matematica equivalente è 2021 <= year <= 2024.
"@year:[2021 2024]"
La seguente query restituirà i libri pubblicati tra il 2021 (escluso) e il 2024 (incluso). L'espressione matematica equivalente è 2021 < year <= 2024.
@year:[(2021 2024]
La seguente query restituirà i libri pubblicati prima del 2024 (incluso). L'espressione matematica equivalente è year <= 2024.
@year:[(-inf 2024]
La seguente query restituirà i libri pubblicati dopo il 2015 (escluso). L'espressione matematica equivalente è year >= 2015.
@year:[2015 +inf]
Utilizza la seguente tabella come guida per mappare le espressioni matematiche alle query di prefiltraggio:
| Espressione matematica | Espressione di filtro |
|---|---|
| min <= field <= max | @field:[min max] |
| min < field <= max | @field:[(min max] |
| min <= field < max | @field:[min (max] |
| min < field < max | @field:[(min (max] |
| field => min | @field:[min +inf] |
| field > min | @field:[(min +inf] |
| field <= max | @field:[-inf max] |
| field < max | @field:[-inf (max] |
| field == val | @field:[val val] |
Operatori logici
È possibile utilizzare più tag e campi numerici per creare query complesse utilizzando gli operatori logici.
AND logico
Per impostare un AND logico, utilizza uno spazio tra i predicati. Ad esempio:
query1 query2 query3
OR logico
Per impostare un OR logico, utilizza il carattere "|" tra i predicati. Ad esempio:
query1 | query2 | query3
Negazione logica
Qualsiasi query può essere negata anteponendo - a ogni query. Le query negative restituiscono tutte le voci che non corrispondono alla query. Sono inclusi anche i documenti che non hanno il campo.
Ad esempio, una query negativa su @genre:{comedy} restituirà tutti i libri che non sono di genere comico E tutti i libri che non hanno un campo di genere.
La seguente query restituirà tutti i libri di genere "comico" che non sono stati pubblicati tra il 2015 e il 2024 o che non hanno un campo anno:
@genre:[comedy] -@year:[2015 2024]
Esempi di combinazione di operatori logici
Gli operatori logici possono essere combinati per formare espressioni di filtro complesse.
La seguente query restituirà tutti i libri di genere "comico" o "horror" (AND) pubblicati tra il 2015 e il 2024:
@genre:[comedy|horror] @year:[2015 2024]
La seguente query restituirà tutti i libri di genere "comico" o "horror" (OR) pubblicati tra il 2015 e il 2024:
@genre:[comedy|horror] | @year:[2015 2024]
La seguente query restituirà tutti i libri che non hanno un campo di genere o che hanno un campo di genere diverso da "comico", pubblicati tra il 2015 e il 2024:
-@genre:[comedy] @year:[2015 2024]
Per informazioni sull'utilizzo, consulta FT.SEARCH info.