Le query vettoriali funzionano cercando in un database di vettori i vettori maggiormente corrispondenti al vettore di query nell'intero cluster. Questa pagina fornisce informazioni dettagliate 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 Neighbor (ANN): trova i k vettori approssimativi più vicini al vettore della 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 l'ANN, gli indici devono essere creati con il tipo di indice vettoriale HNSW. Con le ANN, le query di ricerca saranno approssimative, ma più veloci. La precisione dell'ANN può essere migliorata modificando i parametri dell'indice HNSW e il parametro EF_RUNTIME nella query.
Suddivisione 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 del filtro ibrido. Nelle espressioni dei filtri sono supportati solo gli indici di tag e numerici. Per ulteriori dettagli sulle espressioni di filtro, consulta Query ibride.(*)
può essere utilizzato per eseguire query che non richiedono filtri.
=>
: separa il filtro dalla ricerca vettoriale.[KNN num_neighbours @field $vector]
: l'espressione di ricerca KNN. Sostituiscinum_neighbors
con il numero di risultati scelto e@field
con il nome del campo vettoriale.PARAMS 2 my_vector_query_param "query_embedding"
:- Il valore
2
dopoPARAMS
indica 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_embedding
con il vettore di query incorporato.
- Il valore
DIALECT 2
: specifica che stai utilizzando la versione 2 o successive del dialetto delle query (obbligatorio per la ricerca di vettori).
Query ibride
L'espressione iniziale racchiusa tra parentesi tonde () è un'espressione di filtro. Le espressioni di filtro ti consentono di filtrare i vettori durante l'esecuzione della ricerca di vettori. Una query che utilizza un'espressione di filtro per filtrare i risultati è chiamata query ibrida. Qualsiasi combinazione di tag e indici numerici può formare una query ibrida.
Memorystore for Valkey utilizza due approcci per filtrare le ricerche di vettori:
- Prefiltro: il prefiltro si basa su indici secondari (ad es. tag, numerici) per trovare innanzitutto le corrispondenze all'espressione del filtro, indipendentemente dalla somiglianza del vettore. Una volta calcolati i risultati filtrati, viene eseguita una ricerca bruta per ordinare in base alla somiglianza del vettore.
- Filtro in linea: il filtro in linea esegue l'algoritmo di ricerca di vettori (ad es. HNSW), ignorando i vettori trovati che non corrispondono al filtro.
Il prefiltro è più veloce quando lo spazio di ricerca filtrato è molto più piccolo dello spazio di ricerca originale. Quando lo spazio di ricerca filtrato è ampio, il filtro in linea diventa più veloce. Memorystore for Valkey sceglie automaticamente tra le due strategie in base al filtro fornito.
Le espressioni di filtro supportano sia gli indici di tag che quelli numerici.
Tag Index
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 limitati, come colore, genere di libri, nome della città o autore.
- Solo i campi indicizzati possono essere utilizzati come filtro dei tag.
- I campi TAG vengono tokenizzati da un carattere separatore, che per impostazione predefinita è una virgola "," ma è configurabile durante la creazione dell'indice.
- Non viene eseguita alcuna derivazione durante l'indicizzazione di un campo tag.
- In un campo tag è possibile eseguire solo filtri prefissi e esatti. Le query con suffisso e infissi non sono supportate.
- Per impostazione predefinita, i tag non fanno distinzione tra maiuscole e minuscole. Ad esempio, sia "Blu" che "BLUE" verranno indicizzati come "blu" e daranno lo stesso risultato in una query ibrida.
- Le stringhe vuote non vengono né indicizzate né sottoposte a query.
- Durante l'indicizzazione e le 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 di colore blu OPPURE nero OPPURE verde.
@color:{blue | black | green}
Un altro esempio è la seguente query, che restituisce 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 che restituiscano solo i valori compresi tra un determinato valore iniziale e un determinato valore finale.
- Sono supportate sia le query inclusive che quelle esclusive.
- Per le query a risposta aperta, è possibile utilizzare +inf, -inf per esprimere gli intervalli di inizio e di fine.
Ad esempio, la seguente query restituirà i libri pubblicati tra il 2021 e il 2024 (entrambi 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 (esclusivi). L'espressione matematica equivalente è year >= 2015
.
@year:[2015 +inf]
Utilizza la seguente tabella come guida per mappare le espressioni matematiche alle query di prefiltro:
Espressione matematica | Espressione di filtro |
---|---|
min <= campo <= max | @field:[min max] |
min < campo <= max | @field:[(min max] |
min <= campo < max | @field:[min (max] |
min < campo < max | @field:[(min (max] |
campo => min | @field:[min +inf] |
campo > min | @field:[(min +inf] |
campo <= max | @field:[-inf max] |
campo < max | @field:[-inf (max] |
campo == 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'operazione OR logica, utilizza il carattere "|" tra i predicati. Ad esempio:
query1 | query2 | query3
Negazione logica
Qualsiasi query può essere negata anteponendo -
prima di ogni query. Le query escluse restituiscono tutte le voci che non corrispondono alla query. Sono inclusi anche i documenti che non contengono il campo.
Ad esempio, una query negativa su @genre:{comedy}
restituirà tutti i libri che non sono commedie E tutti i libri che non hanno un campo genere.
La seguente query restituisce tutti i libri con genere "commedia" non pubblicati tra il 2015 e il 2024 o che non hanno un campo dell'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 con genere "commedia" 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 "commedia" o "horror" (OR) pubblicati tra il 2015 e il 2024:
@genre:[comedy|horror] | @year:[2015 2024]
La seguente query restituisce tutti i libri pubblicati tra il 2015 e il 2024 che non hanno un campo genere o il cui campo genere non è uguale a "commedia":
-@genre:[comedy] @year:[2015 2024]
Per informazioni sull'utilizzo, consulta le informazioni su FT.SEARCH.