VECTOR_SEARCH 쿼리

Flink SQL은 SQL 쿼리에서 벡터 검색을 수행하는 VECTOR_SEARCH 테이블-값 함수(TVF)를 제공해요. 이 함수로 고차원 벡터에 따라 유사한 행을 검색할 수 있어요.

출처: Vector Search

본문

{{< label Batch >}} {{< label Streaming >}}

VECTOR_SEARCH Function

VECTOR_SEARCH는 processing-time 속성을 사용해 외부 테이블의 최신 버전 데이터와 행을 연결해요. Flink SQL의 lookup join과 매우 유사하지만, 차이는 VECTOR_SEARCH가 입력 데이터 벡터를 사용해 외부 테이블의 데이터와 유사도를 비교하고 top-k개의 가장 유사한 행을 반환한다는 점이에요.

Syntax

SELECT * 
FROM input_table, LATERAL TABLE(VECTOR_SEARCH(
   TABLE vector_table, 
   input_table.vector_column, 
   DESCRIPTOR(index_column),
   top_k,
   [CONFIG => MAP['key', 'value']]
   ))

Parameters

  • input_table: 처리할 데이터를 포함하는 입력 테이블
  • vector_table: 벡터로 검색할 수 있는 외부 테이블의 이름
  • vector_column: 입력 테이블의 컬럼 이름, 타입은 FLOAT ARRAY 또는 DOUBLE ARRAY여야 해요
  • index_column: 벡터 테이블의 어떤 컬럼을 입력 데이터와 유사도 비교에 사용할지 지정하는 descriptor
  • top_k: 반환할 가장 유사한 행의 top-k 개수
  • config: (선택) 벡터 검색을 위한 구성 옵션 맵

Configuration Options

config 맵에서 다음 구성 옵션을 지정할 수 있어요:

async: 벡터 검색을 비동기로 수행할지 여부 timeout: 비동기 검색의 타임아웃

Example

-- Basic usage
SELECT * FROM 
input_table, LATERAL TABLE(VECTOR_SEARCH(
  TABLE vector_table,
  input_table.vector_column,
  DESCRIPTOR(index_column),
  10
));

-- With configuration options
SELECT * FROM 
input_table, LATERAL TABLE(VECTOR_SEARCH(
  TABLE vector_table,
  input_table.vector_column,
  DESCRIPTOR(index_column),
  10,
  MAP['async', 'true', 'timeout', '100s']
));

-- Using named parameters
SELECT * FROM 
input_table, LATERAL TABLE(VECTOR_SEARCH(
  SEARCH_TABLE => TABLE vector_table,
  COLUMN_TO_QUERY => input_table.vector_column,
  COLUMN_TO_SEARCH => DESCRIPTOR(index_column),
  TOP_K => 10,
  CONFIG => MAP['async', 'true', 'timeout', '100s']
));

-- Searching with contant value
SELECT * 
FROM TABLE(VECTOR_SEARCH(
  TABLE vector_table,
  ARRAY[10, 20],
  DESCRIPTOR(index_column),
  10,
));

Output

출력 테이블은 입력 테이블의 모든 컬럼, 벡터 검색 테이블의 컬럼, 그리고 입력 행과 매칭 행 사이의 유사도를 나타내는 score라는 컬럼을 포함해요.

Notes

  1. 벡터 테이블의 구현은 org.apache.flink.table.connector.source.VectorSearchTableSource 인터페이스를 구현해야 해요. 자세한 내용은 Vector Search Table Source를 참고하세요.
  2. VECTOR_SEARCH는 append-only 테이블만 소비할 수 있어요.
  3. 함수 호출이 다른 테이블과 상관관계가 없으면 VECTOR_SEARCHLATERAL 키워드를 요구하지 않아요. 예를 들어 검색 컬럼이 상수·리터럴 값이면 LATERAL을 생략할 수 있어요.

더 알아보기 (Learn more)