Sintassi delle query

Le query vettoriali funzionano eseguendo la ricerca in un database vettoriale per trovare i vettori che corrispondono meglio al vettore di query nell'intero cluster. Questa pagina fornisce dettagli sul funzionamento di questa funzionalità.

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 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 di filtro ibrida. Nelle espressioni di filtro sono supportati solo gli indici numerici e dei tag. Per maggiori dettagli sulle espressioni di filtro, consulta Query ibride.

    • (*) può essere utilizzato per eseguire query che non richiedono il filtraggio.
  • =>: separa il filtro dall'espressione di ricerca vettoriale.

  • [KNN num_neighbours @field $vector]: l'espressione di ricerca KNN. Sostituisci num_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 dopo PARAMS indica che devono essere forniti due argomenti aggiuntivi.
    • my_vector_query_param è il nome del vettore del parametro di ricerca, 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 successive del dialetto della 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 dell'espressione di ricerca vettoriale. Una query che utilizza un'espressione di filtro per filtrare i risultati viene chiamata query ibrida. Qualsiasi combinazione di tag e indici numerici può formare una query ibrida.

Memorystore for Redis Cluster utilizza due approcci per filtrare le espressioni di ricerca vettoriale:

  1. Pre-filtraggio: il pre-filtraggio 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 vettoriale.
  2. Filtro in linea: il filtro 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 è ampio, il filtro 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 numerici che i tag.

Indice dei 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 un libro, nome di una città o autore.

  • Solo i campi indicizzati possono essere utilizzati come filtro dei tag.
  • I campi TAG sono 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.
  • Su un campo tag possono essere eseguiti solo filtri esatti e con prefisso. Le query con suffisso e infisso non sono supportate.
  • Per impostazione predefinita, i tag non fanno distinzione tra maiuscole e minuscole. Ad esempio, "Blue" e "BLUE" verranno entrambi indicizzati come "blue" e produrranno lo stesso risultato in una query ibrida.
  • Le stringhe vuote non vengono né indicizzate né interrogate.
  • Durante l'indicizzazione e l'esecuzione di 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à i documenti di colore blu, nero o verde.

@color:{blue | black | green}

Come altro esempio, la seguente query restituirà 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 uno finale specifici.

  • Sono supportate sia le query inclusive sia quelle esclusive.
  • Per le query aperte, è 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 operatori logici.

AND logico

Per impostare un operatore 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 - prima di 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 commedie E tutti i libri che non hanno un campo genere.

La seguente query restituirà tutti i libri di genere "commedia" 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 "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 restituirà tutti i libri che non hanno un campo genere o che hanno un campo genere diverso da "commedia" e che sono stati pubblicati tra il 2015 e il 2024:

-@genre:[comedy] @year:[2015 2024]

Per informazioni sull'utilizzo, consulta la sezione FT.SEARCH.