Redisearch 벡터 검색
Redisearch 벡터 검색
Redisearch는 벡터 유사도 검색도 지원해요. 인덱스에 VECTOR 필드를 선언하고, 쿼리 벡터와의 거리(KNN)로 근접 이웃을 찾는 방식이에요. 벡터 인덱스 알고리즘으로는 FLAT과 HNSW를 선택할 수 있어요.
출처: https://redis.io/docs/latest/develop/data-types/search/vector-similarity/
벡터 필드 만들기
벡터 필드는 FT.CREATE에서 VECTOR 타입으로 선언해요. 알고리즘, 옵션 개수, 차원, 거리 메트릭을 지정해요.
FT.CREATE idx:items ON HASH PREFIX 1 "item:" SCHEMA \
embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 384 DISTANCE_METRIC COSINE
TYPE은 벡터 요소의 숫자 타입(FLOAT32 등), DIM은 벡터 차원, DISTANCE_METRIC은 거리 계산 방식(COSINE, L2, IP(내적))이에요.
KNN 검색
KNN 쿼리는 *=>[KNN <k> @<필드> $BLOB] 문법을 써요. $BLOB 파라미터에 검색할 쿼리 벡터를 바이트(BLOB)로 넘겨요.
FT.SEARCH idx:items "*=>[KNN 5 @embedding $BLOB]" \
PARAMS 2 BLOB "\x9c\x3d...\x00" \
DIALECT 3
결과는 쿼리 벡터와의 거리(유사도) 순으로 정렬돼요. KNN 5는 가장 가까운 5건을 돌려달라는 뜻이에요.
배치 검색
벡터 배치 검색도 가능해요. FT.SEARCH 쿼리 안에서 벡터 필드의 "range" 검색으로 m개 이내의 결과를 반환하거나, 여러 쿼리 벡터를 VRANGE 같은 방식으로 처리할 수 있어요. 다만 성능과 메모리를 고려해 배치 크기를 정하는 게 좋아요.
하이브리드 필터
벡터 검색에 텍스트·숫자 필터를 결합한 하이브리드 검색도 가능해요. 예를 들어 특정 카테고리 안에서만 벡터로 가까운 결과를 찾으려면 필터 조건을 쿼리 앞에 붙여요.
FT.SEARCH idx:items "(@genre:{fantasy})=>[KNN 5 @embedding $BLOB]" \
PARAMS 2 BLOB "\x9c\x3d...\x00" \
DIALECT 3