A função VECTOR_SEARCH executa buscas de similaridade vetorial para localizar vizinhos mais próximos aproximados em grande escala.
Limitações
A função VECTOR_SEARCH exige que a tabela de entrada seja uma tabela Delta.
Sintaxe
VECTOR_SEARCH(
{ TABLE base_table | (base_table_query) }, -- The table containing the embedding vectors to search against.
column_to_search, -- The column in the base table that contains the embedding vectors.
{ TABLE query_table | (query_table_query) }, -- The table providing the query embedding vectors.
query_column_to_search, -- The column in the query table that contains the query embedding vectors.
top_k -- The number of nearest neighbors to return.
[, distance_type] -- The metric for calculating distance.
[, options] -- A JSON string containing other configurable parameters.
)
Parâmetros
base_table | (base_table_query): Obrigatório. Tabela base que contém os vetores de embedding usados como referência na busca.column_to_search: Obrigatório. Nome da coluna na tabela base onde estão armazenados os vetores de embedding.query_table | (query_table_query): Obrigatório. Tabela que fornece os vetores de embedding da consulta.query_column_to_search: Obrigatório. Nome da coluna na tabela de consulta que contém os vetores de embedding.top_k: Obrigatório. Quantidade de vizinhos mais próximos a serem retornados. Deve ser um número inteiro positivo (≥ 1).-
distance_type: Opcional. Define a métrica usada para calcular a distância entre dois vetores. Os seguintes tipos são suportados:cosine: Calcula a similaridade do cosseno entre dois vetores. Comumente utilizada em cenários com vetores de características de texto ou imagem, nos quais a direção do vetor é relevante.euclidean(Padrão): Mede a distância euclidiana, correspondente à distância em linha reta entre dois vetores no espaço.dot_product: Calcula o produto escalar. Indicada para vetores normalizados, em que valores maiores representam maior similaridade.
-
options: Opcional. String formatada em JSON com parâmetros adicionais de configuração. Exemplo:use_brute_force: Valor booleano em JSON que indica se a busca por força bruta deve ser usada, ignorando qualquer índice vetorial disponível. Exemplo: '{"use_brute_force":true}'. O valor padrão é false. Caso você defina use_brute_force=false e não haja índice vetorial disponível, o sistema adota automaticamente a busca por força bruta.
Valores de retorno
Para cada linha nos dados de consulta, a função retorna múltiplas linhas da tabela base que atendem aos critérios de busca. A quantidade de linhas retornadas por linha de consulta corresponde ao valor definido em top_k. A ordem de saída não é garantida.
query: STRUCT contendo todas as colunas selecionadas dos dados de consulta. Esta coluna aparece na saída apenas ao usar a sintaxe de busca em lote e é omitida em buscas de vetor único.
base: STRUCT com todas as colunas da base_table ou com o subconjunto de colunas selecionado na base_table_query.
distance: Valor DOUBLE que representa a distância entre os dados da base e os dados da consulta.
Exemplos
Preparação dos dados
-- Enable the VECTOR data type.
set odps.sql.type.vector.enable=true;
set odps.sql.type.system.odps2=true;
-- Create a base table for nearest neighbor search and insert data.
CREATE OR REPLACE TABLE base_table
(
id STRING,
my_embedding VECTOR(FLOAT,2)
)
TBLPROPERTIES (
"table.format.version"="2"
);
INSERT into base_table (id, my_embedding)
VALUES('dog', CAST(array(1.0, 2.0) AS VECTOR(FLOAT,2))),
('wolf', CAST(array(2.0, 4.0) AS VECTOR(FLOAT,2))),
('snake', CAST(array(-2.0, 3.0) AS VECTOR(FLOAT,2))),
('lion', CAST(array(2.0, -2.5) AS VECTOR(FLOAT,2))),
('tiger', CAST(array(3.0, -2.0) AS VECTOR(FLOAT,2))),
('otter', CAST(array(-3.0, -1.0) AS VECTOR(FLOAT,2))),
('whale', CAST(array(-5.0, -1.0) AS VECTOR(FLOAT,2)));
-- Create a query table for the search vectors and insert data.
CREATE OR REPLACE TABLE query_table
(
query_id STRING,
embedding VECTOR(FLOAT,2)
)TBLPROPERTIES (
"table.format.version"="2"
);
INSERT INTO query_table (query_id, embedding)
VALUES('dog', CAST(array(1.0, 2.0) AS VECTOR(FLOAT,2))),
('cat', CAST(array(1.0, -1.0) AS VECTOR(FLOAT,2)));
Neste exemplo, são identificados os dois vizinhos mais próximos na coluna my_embedding da base_table para cada vetor presente na coluna embedding da query_table.
SELECT *
FROM
VECTOR_SEARCH(
TABLE base_table,
my_embedding,
(SELECT query_id, embedding FROM query_table),
embedding,
2);
-- Returns:
+----------+-----------+----+--------------+------------+
| query_id | embedding | id | my_embedding | distance |
+----------+-----------+----+--------------+------------+
| dog | [1, 2] | dog | [1, 2] | 0.0 |
| dog | [1, 2] | wolf | [2, 4] | 5.0 |
| cat | [1, -1] | lion | [2, -2.5] | 3.25 |
| cat | [1, -1] | tiger | [3, -2] | 5.0 |
+----------+-----------+----+--------------+------------+