Sintaxis de las consultas

Las consultas de vectores funcionan mediante la búsqueda en una base de datos de vectores para encontrar los vectores que mejor coinciden con tu vector de consulta en todo el clúster. En esta página, se proporcionan detalles sobre cómo funciona esto.

Cómo 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 a tu vector de consulta.
  • Vecinos más cercanos aproximados (ANN): Encuentra los k vectores más cercanos aproximados a tu vector de consulta.

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

Desglose de la sintaxis de las consultas

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 de vectores.

  • (hybrid_filter_expression): Es la expresión de filtro híbrida. Solo se admiten índices numéricos y de etiquetas 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 requieren filtrado.
  • =>: Separa el filtro de la búsqueda de vectores.

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

  • 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 de parámetros 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 o posterior del dialecto de consulta (obligatorio para la búsqueda de vectores).

Consultas híbridas

La expresión inicial incluida 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 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., numéricos o de etiquetas) para encontrar primero las coincidencias con la expresión de filtro, independientemente de la similitud de vectores. Una vez que se calculan los resultados filtrados, se realiza una búsqueda de fuerza bruta para ordenar por similitud de vectores.
  2. Filtrado intercalado: El filtrado intercalado ejecuta el algoritmo de búsqueda de vectores (p.ej., HNSW) y omite 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 según el 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 conjuntos pequeños 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 etiquetas.
  • Los campos TAG se tokenizan con un carácter separador, que es una coma "," de forma predeterminada, pero se puede configurar durante la creación del índice.
  • No se realiza la derivación mientras se indexa un campo de etiquetas.
  • Solo se pueden realizar filtros previos exactos y de prefijo en un campo de etiquetas. No se admiten consultas de sufijo ni de infijo.
  • De forma predeterminada, las etiquetas no distinguen mayúsculas de minúsculas. Por ejemplo, "Blue" y "BLUE" se indexarán como "blue" y mostrarán el mismo resultado en una consulta híbrida.
  • Las cadenas vacías no se indexan ni se consultan.
  • Durante la indexación y la consulta, se quitan los espacios en blanco finales.
Sintaxis

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

@:{  |  | ...}

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

@color:{blue | black | green}

Como otro ejemplo, la siguiente consulta mostrará documentos que contengan "hello world" o "hello universe".

@color:{hello world | hello universe}

Índice numérico

Los índices numéricos permiten filtrar consultas para mostrar solo los valores que se encuentran entre un valor de inicio y un valor final determinados.

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

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

"@year:[2021 2024]"

La siguiente consulta mostrará los 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á los libros publicados antes de 2024 (inclusive). La expresión matemática equivalente es year <= 2024.

@year:[(-inf 2024]

La siguiente consulta mostrará los libros publicados después de 2015 (exclusivo). 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 consultas de filtrado previo:

Expresión matemática Expresión de 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]

Operadores lógicos

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

AND lógico

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

query1 query2 query3
OR lógico

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

query1 | query2 | query3
Negación lógica

Se puede negar cualquier consulta agregando - 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 tienen el campo.

Por ejemplo, una consulta negativa en @genre:{comedy} mostrará todos los libros que no sean de 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 tienen un campo de género o que tienen un campo de género que no es igual a "comedia" y que se publicaron entre 2015 y 2024:

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

Consulta la información de FT.SEARCH para obtener información sobre el uso.