FT.SEARCH
는 제공된 쿼리로 색인을 검색하고 지정된 값을 반환합니다. FT.SEARCH는 쿼리한 노드뿐만 아니라 전체 클러스터의 결과를 반환합니다.
쿼리 구문에 대한 자세한 내용은 쿼리 구문을 참조하세요.
구문
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
(필수): 쿼리하려는 색인입니다.query
(필수): 쿼리입니다. 쿼리 구문에 대한 자세한 내용은 쿼리 구문을 참조하세요.NOCONTENT
(선택사항): 문서 ID만 반환하고 콘텐츠를 제외합니다.TIMEOUT
(선택사항): 검색 명령어의 제한 시간 값을 설정할 수 있습니다.PARAMS
(선택사항): 키 값 쌍 개수에 2를 곱한 값입니다.RETURN
(선택사항): 반환된 값의 별칭과 함께 문서에서 검색하려는 필드를 지정합니다. 기본적으로 필드가 반환되지 않는NOCONTENT
옵션을 설정하지 않은 한 모든 필드가 반환됩니다. num이 0으로 설정되었으면NOCONTENT
와 동일하게 작동합니다.LIMIT
(선택사항): 오프셋과 숫자를 사용하여 페이지로 나누기를 선택할 수 있습니다. 이 매개변수를 사용하지 않는 경우 기본값은 키를 최대 10개까지 반환하는LIMIT 0 10
입니다.DIALECT 2
(선택사항): 언어를 지정합니다. 지원되는 유일한 언어는 언어 2입니다.
명령어 반환
이 명령어는 배열이나 오류 메시지를 반환합니다. 반환된 배열의 요소는 가장 일치하는 쿼리 결과를 나타냅니다. 각 배열 요소에는 다음이 포함됩니다.
항목 해시 키
다음의 배열입니다.
- 키 값: [$score_as ] score_value
- 거리 값
- 속성 이름
- 벡터 값
NOCONTENT
를 사용하면 배열 요소는 문서 ID로만 구성됩니다.
예시 1: 단순 벡터 검색 쿼리
이 예시에서는 고객이 몇 가지 특성을 기준으로 숙박시설물을 검색할 수 있는 속성 검색 색인을 빌드한다고 가정합니다. 다음과 같은 특성의 숙박시설물 목록이 있다고 가정해 보세요.
- 설명 - 지정된 숙박시설물의 벡터 임베딩입니다.
- 기타 필드 - 각 숙박시설물에는 다른 메타데이터도 포함될 수 있습니다. 그러나 단순성을 위해 기타 필드는 이 예시에서 무시됩니다.
먼저 FT.CREATE
명령어를 사용해서 설명을 벡터 필드로 사용하여 HNSW 색인을 만듭니다.
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2
이제 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?"
이제 FT.SEARCH 명령어를 사용하여 쿼리를 수행할 수 있습니다. 다음 쿼리는 제공된 쿼리 벡터에 가장 유사한 숙박시설물을 최대 5개까지 반환합니다.
FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
반환된 결과:
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
코드 샘플
Python
# Before running, ensure you have installed redis-py: # pip install redis import redis client = redis.cluster.RedisCluster(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.Cluster([ { port: 6379, host: "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
예시 2: 하이브리드 쿼리를 사용하는 벡터 검색
이 예시에서는 도시 및 가격이라는 2개의 추가 특성을 사용해서 하이브리드 쿼리를 수행합니다.
- 설명 - 지정된 숙박시설물의 벡터 임베딩입니다.
- 도시 - 도시 이름입니다.
- 가격 - 숙박시설물의 가격입니다.
먼저 설명 벡터 필드, 도시 태그 필드, 가격 숫자 필드를 사용해서 색인을 만듭니다.
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC
이제 숙박시설물을 몇 개 삽입할 수 있습니다. 이 작업은 색인 생성 전에 수행할 수도 있습니다.
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
이제 쿼리를 수행할 수 있습니다. 다음 쿼리는 제공된 쿼리 벡터에 대해 가장 유사한 숙박시설물을 최대 5개까지 반환하고, BANGALORE 가격이 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
반환된 결과:
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
필터 쿼리 형식에 대한 자세한 내용은 쿼리 구문을 참조하세요.
코드 샘플
Python
# Before running, ensure you have installed redis-py: # pip install redis import redis client = redis.cluster.RedisCluster(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.Cluster([ { port: 6379, host: "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