Sintaxis de las consultas

Las consultas vectoriales funcionan buscando 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.

Cómo encontrar vectores similares

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

  • K-Nearest Neighbors (KNN): Encuentra los k vectores más cercanos a tu vector de búsqueda.
  • Vecinos más cercanos aproximados (ANN): Encuentra los k vectores más cercanos aproximados a tu vector de búsqueda.

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

Desglose de la sintaxis de búsqueda

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íbrido. En las expresiones de filtro, solo se admiten etiquetas y números de índice. 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 expresión de 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 vector.

  • 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 búsqueda, como se especifica en la expresión de búsqueda de KNN.
    • Reemplaza query_embedding por tu vector de búsqueda incorporado.
  • DIALECT 2: Especifica que usas la versión 2 o posterior del dialecto de la búsqueda (obligatorio para la búsqueda vectorial).

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 expresión de búsqueda de vectores. Una búsqueda que utiliza una expresión de filtro para filtrar los resultados se denomina búsqueda híbrida. Cualquier combinación de índices numéricos y de etiquetas puede formar una búsqueda híbrida.

Memorystore for Redis Cluster usa dos enfoques para filtrar expresiones de búsqueda de vectores:

  1. Prefiltrado: El prefiltrado se basa en índices secundarios (p.ej., etiqueta, numérico) 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 los resultados por similitud de vectores.
  2. Filtrado intercalado: El filtrado intercalado ejecuta el algoritmo de búsqueda de vectores (p.ej., HNSW) y, luego, ignora los vectores encontrados que no coinciden con el filtro.

El prefiltrado 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 Redis Cluster 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. En 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 los 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 ninguna derivación durante la indexación de un campo de etiqueta.
  • Solo se pueden realizar filtros previos exactos y de prefijo en un campo de etiqueta. No se admiten las consultas con sufijos ni con infijos.
  • De forma predeterminada, las etiquetas no distinguen entre mayúsculas y minúsculas. Por ejemplo, "Azul" y "AZUL" se indexarán como "azul" y producirán el mismo resultado en una búsqueda híbrida.
  • Las cadenas vacías no se indexan ni se consultan.
  • Durante la indexación y la búsqueda, 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 devolverá documentos con color azul O negro O verde.

@color:{blue | black | green}

Como otro ejemplo, la siguiente búsqueda devolverá documentos que contengan "hola mundo" o "hola universo".

@color:{hello world | hello universe}

Índice numérico

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

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

Por ejemplo, la siguiente consulta devolverá 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 devolverá los libros publicados entre 2021 (sin incluir) y 2024 (incluido). La expresión matemática equivalente es 2021 < year <= 2024.

@year:[(2021 2024]

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

@year:[(-inf 2024]

La siguiente consulta devolverá los libros publicados después del 2015 (sin incluir ese año). 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 prefiltrado:

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

Operadores lógicos

Se pueden usar varios campos numéricos y etiquetas para construir 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

Cualquier búsqueda se puede negar anteponiendo - antes de cada búsqueda. Las búsquedas negativas muestran todas las entradas que no coinciden con la búsqueda. Esto también incluye los documentos que no tienen el campo.

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

La siguiente consulta devolverá todos los libros del 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 devolverá 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 devolverá todos los libros con el género "comedia" o "terror" (OR) publicados entre 2015 y 2024:

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

La siguiente consulta devolverá 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 obtener información sobre el uso.