Sintassi delle query

Le query vettoriali funzionano cercando in un database di vettori i vettori maggiormente corrispondenti al vettore di query nell'intero cluster. Questa pagina fornisce dettagli su come questo funziona.

Ricerca di vettori simili

Le query di ricerca vettoriale utilizzano due strategie:

  • K-Nei vicini più vicini (KNN): trova i k vettori più vicini al vettore di query.
  • Nei vicini più vicini approssimati (ANN): trova i vettori approssimati k più vicini 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 l'ANN, gli indici devono essere creati con il tipo di indice vettoriale HNSW. Con le reti neurali artificiali, le query di ricerca saranno approssimative, ma più veloci. La precisione della ANN può essere migliorata regolando i parametri dell'indice HNSW e il parametro EF_RUNTIME nella query.

Analisi della sintassi di 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 di filtro sono supportati solo gli indici numerici e di tag. 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. Sostituisci num_neighbors con il numero scelto di risultati e @field con il nome del campo vettoriale.

  • PARAMS 2 my_vector_query_param "query_embedding":

    • Il valore 2 dopo PARAMS 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.
  • DIALECT 2: specifica che stai utilizzando la versione 2 o successiva del dialetto delle query (obbligatorio per la ricerca vettoriale).

Query ibride

L'espressione iniziale racchiusa tra parentesi () è un'espressione di filtro. Le espressioni di filtro ti consentono di filtrare i vettori durante l'esecuzione della ricerca vettoriale. 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:

  1. Pre-filtro: il pre-filtro 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.
  2. 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 è molto ampio, il filtro in linea diventa più rapido. Memorystore per 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 sono tokenizzati da un carattere separatore, ovvero una virgola "," per impostazione predefinita, ma configurabili durante la creazione dell'indice.
  • Non viene eseguita alcuna derivazione durante l'indicizzazione di un campo tag.
  • In un campo del tag è possibile eseguire solo filtri prefissi e esatti. Le query con suffisso e infix 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 indicizzate né query.
  • Durante l'indicizzazione e le query, gli spazi vuoti finali vengono rimossi.
Sintassi

In questo caso { e } fanno parte della sintassi e | viene utilizzato come operatore OR per supportare più tag:

@:{  |  | ...}

Ad esempio, la seguente query restituirà documenti di colore blu O nero O 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 valori compresi tra un determinato valore iniziale e 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]
campo min <= < massimo @field:[min (max]
min < campo < max @field:[(min (max]
campo => min @field:[min +inf]
campo > di min @field:[(min +inf]
campo <= max @field:[-inf max]
campo < massimo @field:[-inf (max]
campo == val @field:[val val]

Operatori logici

È possibile utilizzare più tag e campi numerici per costruire query complesse utilizzando 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 annullata anteponendo - a 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 esclusa su @genre:{comedy} restituirà tutti i libri che non sono comici E tutti i libri che non hanno un campo Genere.

La seguente query restituisce tutti i libri con genere "commedia" che non sono stati 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 con "commedia" o "horror" genere (OR) pubblicato 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]

Consulta le informazioni di FT.SEARCH per informazioni sull'utilizzo.