FT.SEARCH
pesquisa o índice com a consulta fornecida e devolve os valores especificados.
Para ver detalhes sobre a sintaxe de consulta, consulte o artigo Sintaxe de consulta.
Sintaxe
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
(obrigatório): este é o índice que quer consultar.query
(obrigatório): esta é a sua consulta. Para ver detalhes sobre a sintaxe de consulta, consulte o artigo Sintaxe de consulta.NOCONTENT
(opcional): devolve apenas os IDs dos documentos e exclui o conteúdo.TIMEOUT
(opcional): permite-lhe definir um valor de limite de tempo para o comando de pesquisa.PARAMS
(opcional): o número de pares de chave-valor multiplicado por dois.RETURN
(opcional): especifica os campos que quer obter dos seus documentos, juntamente com quaisquer alias para os valores devolvidos. Por predefinição, todos os campos são devolvidos, a menos que a opçãoNOCONTENT
esteja definida, caso em que nenhum campo é devolvido. Se num for definido como 0, comporta-se da mesma forma queNOCONTENT
.LIMIT
(opcional): permite-lhe escolher a paginação com um desvio e uma contagem de números. Se não usar este parâmetro, a predefinição éLIMIT 0 10
, que devolve, no máximo, 10 chaves.DIALECT 2
(opcional): especifica o seu dialeto. O único dialeto suportado é o dialeto 2.
Comando de retorno
Este comando devolve uma matriz ou uma mensagem de erro. Os elementos da matriz devolvida representam os resultados com a melhor correspondência da consulta. Cada elemento da matriz tem o seguinte:
A chave hash de entrada
Uma matriz do seguinte:
- Chave-valor: [$score_as ] score_value
- Valor da distância
- Nome do atributo
- Valor do vetor
Se for usado
NOCONTENT
, os elementos da matriz consistem apenas nos IDs dos documentos.
Exemplo n.º 1: consulta de pesquisa vetorial simples
Para este exemplo, vamos supor que estamos a criar um índice de pesquisa de propriedades onde os clientes podem pesquisar propriedades com base em algumas funcionalidades. Suponhamos que temos uma lista de propriedades com os seguintes atributos:
- Descrição: incorporação vetorial para a propriedade especificada.
- Outros campos: cada propriedade também pode ter outros metadados. No entanto, para simplificar, os outros campos são ignorados neste exemplo.
Primeiro, criamos um índice HNSW com a descrição como um campo vetorial através do comando FT.CREATE
:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2
Agora, podemos inserir algumas propriedades (também é possível fazê-lo antes da criação do índice) através do 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?"
Agora, podemos executar consultas com o comando FT.SEARCH. A consulta seguinte devolve até cinco das propriedades mais semelhantes ao vetor de consulta fornecido:
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 devolvido:
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
Exemplo 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
Exemplo n.º 2: pesquisa vetorial com consultas híbridas
Para este exemplo, vamos fazer uma consulta híbrida usando dois atributos adicionais denominados cidade e preço:
- Descrição: incorporação vetorial para a propriedade especificada.
- Cidade: nome da cidade.
- Preço: custo da propriedade.
Inicialmente, criamos um índice com a descrição como um campo vetorial, a cidade como um campo de etiqueta e o preço como um campo numérico:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC
Agora, podemos inserir algumas propriedades (também pode fazê-lo antes da criação do í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
Agora, podemos executar consultas. A consulta seguinte devolve até cinco das propriedades mais semelhantes ao vetor de consulta fornecido, filtrando apenas as propriedades em BANGALORE com um preço inferior a 100 000:
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 devolvido:
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
Consulte o artigo Sintaxe de consulta para ver detalhes sobre o formato de consulta de filtro.
Exemplo 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