FT.SEARCH

FT.SEARCH busca en el índice con la consulta proporcionada y muestra los valores especificados.

Para obtener detalles sobre la sintaxis de las consultas, consulta Sintaxis de consultas.

Sintaxis

FT.SEARCH index query
  [NOCONTENT]
  [TIMEOUT timeout]
  [PARAMS nargs name value [ name value ...]]
  [RETURN num field [AS alias] [ field [AS alias] ... ]]
  [LIMIT offset num]
  DIALECT 2
  • index (obligatorio): Es el índice que deseas consultar.
  • query (obligatorio): Es tu consulta. Para obtener detalles sobre la sintaxis de las consultas, consulta Sintaxis de consultas.
  • NOCONTENT (opcional): Muestra solo los IDs de documentos y excluye el contenido.
  • TIMEOUT (opcional): Te permite establecer un valor de tiempo de espera para el comando de búsqueda.
  • PARAMS (opcional): Es la cantidad de pares clave-valor multiplicada por dos.
  • RETURN (opcional): Especifica los campos que deseas recuperar de tus documentos, junto con los alias de los valores que se muestran. De forma predeterminada, se muestran todos los campos, a menos que se establezca la opción NOCONTENT, en cuyo caso no se muestra ningún campo. Si num se establece en 0, se comporta igual que NOCONTENT.
  • LIMIT (opcional): Te permite elegir la paginación con un desplazamiento y un recuento de números. Si no usas este parámetro, el valor predeterminado es LIMIT 0 10, que muestra un máximo de 10 claves.
  • DIALECT 2 (opcional): Especifica tu dialecto. El único dialecto compatible es el dialecto 2.

Resultado del comando

  • Este comando muestra un array o un mensaje de error. Los elementos del array que se muestra representan los resultados mejor coincidentes de la consulta. Cada elemento del array tiene lo siguiente:

  • La clave hash de entrada

  • Un array de lo siguiente:

    • Valor clave: [$score_as ] score_value
    • Valor de distancia
    • Nombre del atributo
    • Valor vectorial

    Si se usa NOCONTENT, los elementos del array constan solo de los IDs de documentos.

Ejemplo 1: Consulta de búsqueda vectorial simple

En este ejemplo, supongamos que estamos creando un índice de búsqueda de propiedades en el que los clientes pueden buscar propiedades en función de algunas características. Supongamos que tenemos una lista de propiedades con los siguientes atributos:

  • Descripción: embedding de vector para la propiedad determinada.
  • Otros campos: Cada propiedad también puede tener otros metadatos. Sin embargo, para simplificar, se ignoran otros campos en este ejemplo.

Primero, creamos un índice HNSW con la descripción como un campo vectorial mediante el comando FT.CREATE:

FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2

Ahora podemos insertar algunas propiedades (esto también se puede hacer antes de la creación del índice) con el comando HSET:

HSET p1 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?"
HSET p2 description "\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00"
HSET p3 description "\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00"
HSET p4 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?"
HSET p5 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?"

Ahora podemos realizar consultas con el comando FT.SEARCH. La siguiente consulta muestra hasta cinco de las propiedades más similares al vector de consulta proporcionado:

FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2

Resultado mostrado:

 1) (integer) 5
 2) p5
 3) 1) __description_score
    2) 1.6400001049
    3) description
    4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?
 4) p4
 5) 1) __description_score
    2) 1.6400001049
    3) description
    4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?
 6) p2
 7) 1) __description_score
    2) 1.6400001049
    3) description
    4) \x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00
 8) p1
 9) 1) __description_score
    2) 1.6400001049
    3) description
    4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?
10) p3
11) 1) __description_score
    2) 0.0399999953806
    3) description
    4) \x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00

Muestra de código

Python

# Before running, ensure you have installed redis-py:
#    pip install redis

import redis
client = redis.Redis(host='your_server_host', port=6379)
result = client.execute_command('FT.SEARCH', 'idx', '*=>[KNN 5 @description $query_vector]', 'PARAMS', '2', 'query_vector', '"\xcd\xccL?\x00\x00\x00\x00"', 'DIALECT', '2')
print(result)

NodeJS

# Before running, ensure you have installed ioredis:
#   npm install ioredis

const Redis = require("ioredis");
const redis = new Redis(6379, "your_server_host")
redis.call("FT.SEARCH", "idx", "*=>[KNN 5 @description $query_vector]", "PARAMS", "2", "query_vector", "\xcd\xccL?\x00\x00\x00\x00\x00\x00", "DIALECT", "2").then(result => {
console.log(result);
redis.disconnect();
});

CLI

# Before running, ensure you have install redis-cli

redis-cli -h your_server_host -p 6379 FT.SEARCH idx "(*)=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2

Ejemplo 2: Búsqueda vectorial con consultas híbridas

En este ejemplo, realizaremos una consulta híbrida con dos atributos adicionales llamados ciudad y precio:

  • Descripción: embedding de vector para la propiedad determinada.
  • Ciudad: Nombre de la ciudad.
  • Precio: Costo de la propiedad.

Primero, creamos un índice con la descripción como un campo vectorial, la ciudad como un campo de etiqueta y el precio como un campo numérico:

FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC

Ahora, podemos insertar algunas propiedades (esto también se puede hacer antes de la creación del índice):

HSET p1 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "NEW YORK" price 500000
HSET p2 description "\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00" city "NEW JERSEY" price 400000
HSET p3 description "\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00" city "BANGALORE" price 60000
HSET p4 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "NEW YORK" price 600000
HSET p5 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "BANGALORE" price 75000

Ahora podemos realizar consultas. La siguiente consulta muestra hasta cinco de las propiedades más similares al vector de consulta proporcionado, filtrando solo aquellas en BANGALORE con un precio inferior a 100000:

FT.SEARCH idx "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2

Resultado mostrado:

1) (integer) 2
2) p5
3) 1) __description_score
   2) 1.6400001049
   3) city
   4) BANGALORE
   5) price
   6) 75000
   7) description
   8) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?
4) p3
5) 1) __description_score
   2) 0.0399999953806
   3) city
   4) BANGALORE
   5) price
   6) 60000
   7) description
   8) \x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00

Consulta Sintaxis de consultas para obtener detalles sobre el formato de la consulta de filtro.

Muestra de código

Python

# Before running, ensure you have installed redis-py:
#   pip install redis

import redis
client = redis.Redis(host='your_server_host', port=6379)
result = client.execute_command('FT.SEARCH', 'idx', '(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]', 'PARAMS', '2', 'query_vector', '"\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00"', 'DIALECT', '2')
print(result)

NodeJS

# Before running, ensure you have installed ioredis:
#   npm install ioredis

const Redis = require("ioredis");
const redis = new Redis(6379, "your_server_host")
redis.call("FT.SEARCH", "idx", "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]", "PARAMS", "2", "query_vector", "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00", "DIALECT", "2").then(result => {
console.log(result);
redis.disconnect();
});

CLI

# Before running, ensure you have install redis-cli

redis-cli -h your_server_host -p 6379 FT.SEARCH idx "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2