Sintassi delle query

Le query vettoriali funzionano cercando in un database vettoriale i vettori che corrispondono meglio al vettore della query. 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 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 di filtro sono supportati solo gli indici numerici e i 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 dalla 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 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 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 Redis utilizza due approcci per filtrare le ricerche vettoriali:

  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 sceglie automaticamente tra le due strategie in base al filtro fornito.

Le espressioni di filtro supportano sia gli indici numerici che i tag.

Indice 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 stemming 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é sottoposte a query.
  • 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]
campo > 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 logico AND, 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.