Las consultas de vectores funcionan buscando en una base de datos de vectores para encontrar los vectores que mejor se ajusten a tu vector de consulta en todo el clúster. En esta página se explica cómo funciona.
Buscar vectores similares
Las consultas de búsqueda vectorial usan dos estrategias:
- Vecinos más cercanos (KNN): busca los k vectores más cercanos a tu vector de consulta.
- Vecinos más cercanos aproximados (ANN): busca los k vectores más cercanos a tu vector de consulta
Para usar KNN, los índices deben crearse con el tipo de índice de vector FLAT. Con KNN, las consultas de búsqueda serán exactas, pero más lentas. Para usar ANN, los índices deben crearse con el tipo de índice de vector HNSW. Con ANN, las consultas de búsqueda serán aproximadas, pero más rápidas. La precisión de la 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 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
: El nombre del índice que contiene tu campo de vector.(hybrid_filter_expression)
: esta es la expresión de filtro híbrida. En las expresiones de filtro solo se admiten etiquetas e índices numéricos. Consulta Consultas híbridas para obtener más información sobre las expresiones de filtro.(*)
se puede usar para realizar consultas que no requieran filtros.
=>
: separa el filtro de la búsqueda vectorial.[KNN num_neighbours @field $vector]
: la expresión de búsqueda de KNN. Sustituyenum_neighbors
por el número de resultados que quieras y@field
por el nombre del campo de vector.PARAMS 2 my_vector_query_param "query_embedding"
:- El valor
2
después dePARAMS
indica que se deben proporcionar dos argumentos adicionales. my_vector_query_param
es el nombre del vector de parámetros de consulta, tal como se especifica en la expresión de búsqueda de vecinos más cercanos.- Sustituye
query_embedding
por tu vector de consulta insertado.
- El valor
DIALECT 2
: especifica que estás usando la versión 2 o posterior del dialecto de consulta (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 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 etiquetas e índices numéricos puede formar una consulta híbrida.
Memorystore for Valkey usa dos métodos para filtrar las búsquedas de vectores:
- Prefiltro: el prefiltro se basa en índices secundarios (por ejemplo, etiquetas o valores numéricos) para encontrar primero las coincidencias con la expresión de filtro, independientemente de la similitud de los vectores. Una vez que se han calculado los resultados filtrados, se realiza una búsqueda de fuerza bruta para ordenarlos por similitud de vectores.
- Filtrado en línea: el filtrado en línea ejecuta el algoritmo de búsqueda vectorial (por ejemplo, HNSW) e 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 menor que el espacio de búsqueda original. Cuando el espacio de búsqueda filtrado es grande, el filtrado en línea 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 de etiquetas y numéricos.
Í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 el color, el género de un libro, el nombre de una ciudad o el autor.
- Solo se pueden usar campos indexados como filtro de etiquetas.
- Los campos de ETIQUETA se tokenizan 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 al indexar un campo de etiqueta.
- Solo se pueden aplicar prefijos y filtros previos exactos a un campo de etiqueta. No se admiten las consultas de sufijo ni de infijo.
- De forma predeterminada, las etiquetas no distinguen entre mayúsculas y minúsculas. Por ejemplo, "Blue" y "BLUE" se indexarán como "blue" y darán el mismo resultado en una consulta híbrida.
- Las cadenas vacías no se indexan ni se consultan.
- Durante la indexación y las consultas, se elimina cualquier espacio en blanco al final.
Sintaxis
Aquí, {
y }
forman parte de la sintaxis, y |
se usa como operador O para admitir varias etiquetas:
@:{ | | ...}
Por ejemplo, la siguiente consulta devolverá documentos con los colores azul, negro o verde.
@color:{blue | black | green}
Por ejemplo, la siguiente consulta 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 se devuelvan los valores que se encuentren entre un valor inicial y otro final determinados.
- Se admiten consultas inclusivas y exclusivas.
- En el caso de las consultas abiertas, se pueden usar +inf y -inf para expresar los intervalos de inicio y fin.
Por ejemplo, la siguiente consulta devolverá los libros publicados entre el 2021 y el 2024 (ambos incluidos). La expresión matemática equivalente es 2021 <= year <= 2024
.
"@year:[2021 2024]"
La siguiente consulta devolverá los libros publicados entre el 2021 (sin incluir) y el 2024 (incluido). La expresión matemática equivalente es 2021 < year <= 2024
.
@year:[(2021 2024]
La siguiente consulta devolverá los libros publicados antes del 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 este 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 | Expresión de filtrado |
---|---|
min <= campo <= max | @field:[min max] |
min < campo <= max | @field:[(min max] |
min <= campo < max | @field:[min (max] |
min < campo < max | @field:[(min (max] |
field => 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 varias etiquetas y campos numéricos para crear consultas complejas con operadores lógicos.
AND lógico
Para definir un AND lógico, usa un espacio entre los predicados. Por ejemplo:
query1 query2 query3
OR lógico
Para definir un operador lógico OR, usa el carácter "|" entre los predicados. Por ejemplo:
query1 | query2 | query3
Negación lógica
Cualquier consulta se puede negar añadiendo -
antes de cada consulta. Las consultas negativas devuelven 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 sobre @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 hayan publicado entre el 2015 y el 2024, o que no tengan ningún 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 de género "comedia" u "terror" (AND) publicados entre el 2015 y el 2024:
@genre:[comedy|horror] @year:[2015 2024]
La siguiente consulta devolverá todos los libros de género de comedia o terror (OR) publicados entre el 2015 y el 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 "comedia" y que se hayan publicado entre el 2015 y el 2024:
-@genre:[comedy] @year:[2015 2024]
Consulta la información de FT.SEARCH para saber cómo usarla.