Sintaxis de las consultas

Las consultas de vectores operan buscando en una base de datos de vectores para encontrar vectores que se que mejor se adapte al vector de consulta en todo el clúster. En esta página, se proporcionan detalles sobre cómo funciona esto.

Encontrar vectores similares

Las consultas de búsqueda de vectores usan dos estrategias:

  • K-vecinos más cercanos (KNN): Encuentra los k vectores más cercanos al vector de consulta.
  • Vecinos más cercanos aproximados (ANN): Encuentra los vectores más cercanos k aproximados al vector de consulta.

Para usar KNN, los índices se deben crear con el tipo de índice vectorial FLAT. Con KNN, las búsquedas serán exactas, pero más lentas. Para usar ANN, los índices se deben crear con el tipo de índice de vectores HNSW. Con las ANN, las búsquedas serán aproximadas, pero más rápidas. Para mejorar la exactitud de la ANN, ajusta los parámetros del índice HNSW y el parámetro EF_RUNTIME en la consulta.

Desglose de la sintaxis de consulta

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: Es el nombre del índice que contiene tu campo vectorial.

  • (hybrid_filter_expression): Esta es la expresión del filtro híbrido. Solo se admiten índices numéricos y de etiqueta en las expresiones de filtro. Consulta Consultas híbridas para obtener más detalles sobre las expresiones de filtro.

    • (*) se puede usar para realizar consultas que no requieran filtrado.
  • =>: Separa el filtro de la búsqueda vectorial.

  • [KNN num_neighbours @field $vector]: Es la expresión de búsqueda KNN. Reemplaza num_neighbors por la cantidad de resultados elegida y @field por el nombre de tu campo vectorial.

  • PARAMS 2 my_vector_query_param "query_embedding":

    • El valor 2 después de PARAMS indica que se deben proporcionar dos argumentos adicionales.
    • my_vector_query_param es el nombre del vector del parámetro de consulta, como se especifica en la expresión de búsqueda de KNN.
    • Reemplaza query_embedding por tu vector de consulta incorporado.
  • DIALECT 2: Especifica que usas la versión 2 del dialecto de consulta o una posterior (obligatorio para la búsqueda de vectores).

Consultas híbridas

La expresión inicial encerrada entre paréntesis () es una expresión de filtro. Las expresiones de filtro te permiten filtrar vectores durante la ejecución de la búsqueda de vectores. Una consulta que utiliza una expresión de filtro para filtrar los resultados se denomina consulta híbrida. Cualquier combinación de índices numéricos y de etiquetas puede formar una consulta híbrida.

Memorystore for Valkey usa dos enfoques para filtrar búsquedas de vectores:

  1. Filtrado previo: El filtrado previo se basa en índices secundarios (p.ej., de etiquetas o numéricos) para encontrar primero las coincidencias con la expresión del filtro, independientemente de la similitud del vector. Una vez que se calculan los resultados filtrados, se realiza una búsqueda de fuerza bruta para ordenar por similitud vectorial.
  2. Filtrado en línea: realiza el algoritmo de búsqueda de vectores (p.ej., HNSW) e ignora los vectores encontrados que no coinciden con el filtro.

El filtrado previo es más rápido cuando el espacio de búsqueda filtrado es mucho más pequeño que el espacio de búsqueda original. Cuando el espacio de búsqueda filtrado es grande, el filtrado intercalado se vuelve más rápido. Memorystore for Valkey elige automáticamente entre las dos estrategias en función del filtro proporcionado.

Las expresiones de filtro admiten índices numéricos y de etiquetas.

Índice de etiquetas

Las etiquetas son campos de texto que se interpretan como una lista de etiquetas delimitadas por un carácter separador. Por lo general, las etiquetas son pequeños conjuntos de valores con valores posibles finitos, como color, género de libro, nombre de ciudad o autor.

  • Solo se pueden usar campos indexados como filtro de etiqueta.
  • A los campos TAG se les asignan tokens mediante un carácter separador, que es una coma “,” de forma predeterminada, pero se puede configurar durante la creación del índice.
  • No se realiza ninguna derivación cuando se indexa un campo de etiqueta.
  • Solo se pueden aplicar filtros previos exactos o de prefijo en un campo de etiqueta. No se admiten consultas de sufijos ni infijos.
  • De forma predeterminada, las etiquetas no distinguen mayúsculas de minúsculas. Por ejemplo, "Azul" y "AZUL" se indexarán como "azul" y mostrarán el mismo resultado en una búsqueda híbrida.
  • Las cadenas vacías no se indexan ni se consultan.
  • Durante el indexado y la consulta, se quitan los espacios en blanco finales.
Sintaxis

Aquí, { y } forman parte de la sintaxis, y | se usa como un operador OR para admitir varias etiquetas:

@:{  |  | ...}

Por ejemplo, la siguiente consulta devolverá documentos con color azul, negro o verde.

@color:{blue | black | green}

En otro ejemplo, la siguiente consulta mostrará documentos que contengan “hello world” o "hola universo"

@color:{hello world | hello universe}

Índice numérico

Los índices numéricos permiten filtrar las consultas para que solo muestren valores que se encuentren entre un valor de inicio y de finalización determinado.

  • Se admiten consultas inclusivas y exclusivas.
  • Para consultas abiertas, se pueden usar +inf y -inf para expresar rangos de inicio y finalización.

A modo de ejemplo, la siguiente consulta mostrará libros publicados entre 2021 y 2024 (ambos incluidos). La expresión matemática equivalente es 2021 <= year <= 2024.

"@year:[2021 2024]"

La siguiente consulta mostrará libros publicados entre 2021 (exclusivo) y 2024 (inclusive). La expresión matemática equivalente es 2021 < year <= 2024.

@year:[(2021 2024]

La siguiente consulta mostrará libros publicados antes de 2024 (inclusive). La expresión matemática equivalente es year <= 2024.

@year:[(-inf 2024]

La siguiente consulta mostrará libros publicados después de 2015 (exclusivos). La expresión matemática equivalente es year >= 2015.

@year:[2015 +inf]

Usa la siguiente tabla como guía para asignar expresiones matemáticas a las consultas de filtrado previo:

Expresión matemática Filtrar expresión
min <= campo <= máx. @field:[mín. máx.]
min < campo <= máx. @field:[(mín. máx.])
min <= campo < máx. @field:[min (max]
min < campo < máx. @field:[(min (max]
campo = > min @field:[min +inf]
campo > min @campo:[(min +inf]
campo <= máx. @campo:[-inf max]
campo < máx. @field:[-inf (máx]
campo == val @field:[val val]

Operadores lógicos

Se pueden usar varias etiquetas y campos numéricos para construir consultas complejas con operadores lógicos.

AND lógico

Para establecer un operador lógico AND, usa un espacio entre los predicados. Por ejemplo:

query1 query2 query3
OR lógico

Para establecer un O lógico, usa el carácter "|" entre los predicados. Por ejemplo:

query1 | query2 | query3
Negación lógica

Se puede negar cualquier consulta si se antepone - antes de cada consulta. Las consultas negativas muestran todas las entradas que no coinciden con la consulta. Esto también incluye los documentos que no tengan este campo.

Por ejemplo, una búsqueda negativa sobre @genre:{comedy} mostrará todos los libros que no son comedia Y todos los libros que no tengan un campo de género.

La siguiente consulta mostrará todos los libros con el género "comedia" que no se publicaron entre 2015 y 2024, o que no tienen un campo de año:

@genre:[comedy] -@year:[2015 2024]
Ejemplos de combinación de operadores lógicos

Los operadores lógicos se pueden combinar para formar expresiones de filtro complejas.

La siguiente consulta mostrará todos los libros con el género “comedia” o “terror” (Y) publicados entre 2015 y 2024:

@genre:[comedy|horror] @year:[2015 2024]

La siguiente consulta mostrará todos los libros con el género “comedia” o “terror” (O) publicados entre 2015 y 2024:

@genre:[comedy|horror] | @year:[2015 2024]

La siguiente consulta mostrará todos los libros que no tengan un campo de género o que tengan un campo de género que no sea igual a “comedia” y que se hayan publicado entre 2015 y 2024:

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

Consulta la información de FT.SEARCH para conocer su uso.