쿼리 구문

벡터 쿼리는 벡터 데이터베이스를 검색하여 전체 클러스터에서 쿼리 벡터와 가장 일치하는 벡터를 찾습니다. 이 페이지에서는 이 작동 방식을 자세히 설명합니다.

유사한 벡터 찾기

벡터 검색 쿼리는 두 가지 전략을 사용합니다.

  • K-최근접 이웃(KNN): 쿼리 벡터에서 가장 가까운 벡터 k개를 찾습니다.
  • 근사 최근접 이웃(ANN): 쿼리 벡터에 대해 적합한 k개이의 최근접 이웃을 찾습니다.

KNN을 사용하려면 FLAT 벡터 인덱스 유형으로 색인을 만들어야 합니다. KNN을 사용하면 검색 쿼리가 정확하지만 속도가 느립니다. ANN을 사용하려면 HNSW 벡터 색인 유형으로 색인을 만들어야 합니다. ANN을 사용하면 검색 쿼리가 대략적이지만 속도가 빠릅니다. ANN 정확도는 쿼리의 HNSW 색인 매개변수와 EF_RUNTIME 매개변수를 조정하여 향상시킬 수 있습니다.

쿼리 구문 분류

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: 벡터 필드가 포함된 색인의 이름입니다.

  • (hybrid_filter_expression): 하이브리드 필터 표현식입니다. 태그 및 숫자 색인만 필터 표현식에서 지원됩니다. 필터 표현식에 대한 자세한 내용은 하이브리드 쿼리를 참조하세요.

    • (*)를 사용하면 필터링이 필요하지 않은 쿼리를 수행할 수 있습니다.
  • =>: 필터를 벡터 검색에서 분리합니다.

  • [KNN num_neighbours @field $vector]: KNN 검색 표현식입니다. num_neighbors를 선택한 결과 수로, @field를 벡터 필드 이름으로 바꿉니다.

  • PARAMS 2 my_vector_query_param "query_embedding":

    • PARAMS 다음 값 2는 추가 인수 2개를 제공해야 함을 나타냅니다.
    • my_vector_query_param은 KNN 검색 표현식에 지정된 쿼리 매개변수 벡터 이름입니다.
    • query_embedding을 임베딩된 쿼리 벡터로 바꿉니다.
  • DIALECT 2: 쿼리 언어 버전 2 이상을 사용하도록 지정합니다(벡터 검색에 필요).

하이브리드 쿼리

괄호 ()로 묶인 초기 표현식이 필터 표현식입니다. 필터 표현식을 사용하면 벡터 검색을 수행하는 동안 벡터를 필터링할 수 있습니다. 결과를 필터링하기 위해 필터 표현식을 사용하는 쿼리를 하이브리드 쿼리라고 부릅니다. 태그와 숫자 색인의 조합으로 하이브리드 쿼리를 형성할 수 있습니다.

Memorystore for Valkey는 벡터 검색 필터링을 위해 두 가지 접근 방식을 사용합니다.

  1. 사전 필터링: 사전 필터링은 보조 색인(예: 태그, 숫자)을 사용해서 벡터 유사성에 관계없이 필터 표현식에 대한 일치 항목을 먼저 찾습니다. 필터링된 결과를 계산한 후 강제 검색을 수행하여 벡터 유사성에 따라 정렬합니다.
  2. 인라인 필터링: 인라인 필터링은 벡터 검색 알고리즘(예: HNSW)을 수행하고 필터와 일치하지 않는 것으로 확인된 벡터는 무시합니다.

사전 필터링은 필터링된 검색 공간이 원래 검색 공간보다 훨씬 작을 때 속도가 더 빠릅니다. 필터링된 검색 공간이 크면 인라인 필터링이 더 빠릅니다. Memorystore for Valkey는 제공된 필터를 기준으로 두 가지 전략 중에서 자동으로 선택합니다.

필터 표현식은 태그 및 숫자 색인을 모두 지원합니다.

태그 색인

태그는 구분 기호 문자로 구분된 태그 목록으로 해석되는 텍스트 필드입니다. 일반적으로 태그는 색상, 도서 장르, 도시 이름, 저자 등의 유한한 가능한 값이 포함된 작은 값 집합입니다.

  • 색인이 생성된 필드만 태그 필터로 사용할 수 있습니다.
  • TAG 필드는 기본적으로 쉼표 ","인 구분 기호 문자로 토큰화되지만 색인 생성 중 이를 다르게 구성할 수 있습니다.
  • 태그 필드를 색인 생성하는 중에는 어간 추출이 수행되지 않습니다.
  • 프리픽스, 정확한 사전 필터만 태그 필드에서 수행됩니다. 서픽스, 인픽스 쿼리는 지원되지 않습니다.
  • 기본적으로 태그는 대소문자를 구분하지 않습니다. 예를 들어 "Blue"와 "BLUE"는 모두 "blue"로 색인 생성되며 하이브리드 쿼리에서 동일한 결과를 생성합니다.
  • 빈 문자열은 색인 생성 또는 쿼리가 수행되지 않습니다.
  • 색인 생성 및 쿼리 중 후행 공백은 삭제됩니다.
구문

여기서 {}는 구문의 일부이며 |는 여러 태그를 지원하기 위해 OR 연산자로 사용됩니다.

@:{  |  | ...}

예를 들어 다음 쿼리는 blue OR black OR green color가 포함된 문서를 반환합니다.

@color:{blue | black | green}

또 다른 예시로, 다음 쿼리는 "hello world" 또는 "hello universe"가 포함된 문서를 반환합니다.

@color:{hello world | hello universe}

숫자 색인

숫자 색인을 사용하면 필터 쿼리로 지정된 시작 값과 종료 값 사이에 있는 값만 반환할 수 있습니다.

  • 포함 및 제외 쿼리가 모두 지원됩니다.
  • 개방형 쿼리의 경우 +inf, -inf를 사용하여 시작 범위와 종료 범위를 표현할 수 있습니다.

예를 들어 다음 쿼리는 2021년부터 2024년(둘다 포함) 사이에 출판된 도서를 반환합니다. 이에 상응하는 수식은 2021 <= year <= 2024입니다.

"@year:[2021 2024]"

다음 쿼리는 2021년(제외)부터 2024년(포함) 사이에 출판된 도서를 반환합니다. 이에 상응하는 수식은 2021 < year <= 2024입니다.

@year:[(2021 2024]

다음 쿼리는 2024년(포함) 이전에 출판된 도서를 반환합니다. 이에 상응하는 수식은 year <= 2024입니다.

@year:[(-inf 2024]

다음 쿼리는 2015년(제외) 이후에 출판된 도서를 반환합니다. 이에 상응하는 수식은 year >= 2015입니다.

@year:[2015 +inf]

다음 표를 참조하여 수식을 사전 필터링 쿼리에 매핑하세요.

수식 필터 표현식
min <= field <= max @field:[min max]
min < field <= max @field:[(min max]
min <= field < max @field:[min (max]
min < field < max @field:[(min (max]
field => min @field:[min +inf]
field > min @field:[(min +inf]
field <= max @field:[-inf max]
field < max @field:[-inf (max]
field == val @field:[val val]

논리 연산자

다중 태그와 숫자 필드를 사용하면 논리적 연산자를 통해 복잡한 쿼리를 만들 수 있습니다.

논리곱

논리곱을 설정하려면 조건자 사이에 공백을 사용합니다. 예를 들면 다음과 같습니다.

query1 query2 query3
논리합

논리합을 사용하려면 조건자 사이에 '|' 문자를 사용합니다. 예를 들면 다음과 같습니다.

query1 | query2 | query3
논리적 부정

각 쿼리 앞에 -를 붙여서 쿼리를 부정으로 만들 수 있습니다. 부정 쿼리는 해당 쿼리와 일치하지 않는 모든 항목을 반환합니다. 여기에는 필드가 없는 문서도 포함됩니다.

예를 들어 @genre:{comedy}에 대한 부정 쿼리는 코미디 장르가 아닌 모든 도서와 장르 필드가 없는 모든 도서를 반환합니다.

다음 쿼리는 2015년부터 2024년 사이에 출판되지 않았거나 연도 필드가 없는 "코미디" 장르의 모든 도서를 반환합니다.

@genre:[comedy] -@year:[2015 2024]
논리 연산자 조합 예시

논리 연산자를 조합하여 복잡한 필터 표현식을 만들 수 있습니다.

다음 쿼리는 "코미디" 또는 "호러" 장르에 속하고(AND) 2015년부터 2024년 사이에 출판된 모든 도서를 반환합니다.

@genre:[comedy|horror] @year:[2015 2024]

다음 쿼리는 "코미디" 또는 "호러" 장르에 속하거나(OR) 2015년부터 2024년 사이에 출판된 모든 도서를 반환합니다.

@genre:[comedy|horror] | @year:[2015 2024]

다음 쿼리는 장르 필드가 없거나 장르 필드가 있지만 "코미디"가 아니고, 2015년부터 2024년 사이에 출판된 모든 도서를 반환합니다.

-@genre:[comedy] @year:[2015 2024]

사용법은 FT.SEARCH 정보를 참조하세요.