O smlar é uma extensão open-source para o PolarDB for PostgreSQL que calcula a similaridade de arrays diretamente no banco de dados. Ele oferece suporte a índices GiST e GIN para buscas de similaridade rápidas e funciona com todos os tipos de dados nativos do PostgreSQL.
Três algoritmos de similaridade estão disponíveis: consine (padrão), TF-IDF e overlap. Escolha o algoritmo conforme o seu caso de uso: o cosseno é uma medida geral de similaridade vetorial; o TF-IDF pondera termos por frequência e raridade, sendo útil para arrays semelhantes a texto; já o overlap conta elementos compartilhados sem normalização.
Versões suportadas
O smlar exige uma das seguintes versões do PolarDB for PostgreSQL:
PolarDB for PostgreSQL 16 (versão de revisão 2.0.16.9.6.0 ou posterior)
PolarDB for PostgreSQL 14 (versão de revisão 2.0.14.5.1.0 ou posterior)
PolarDB for PostgreSQL 11 (versão de revisão 2.0.11.9.28.0 ou posterior)
Para verificar sua versão de revisão, acesse o console do PolarDB ou execute SHOW polardb_version;. Caso a versão de revisão não atenda aos requisitos, atualize-a.
Instalar e remover o smlar
Instalação:
CREATE EXTENSION smlar;
O operador % do smlar entra em conflito com o operador % do rum. Não há suporte para instalar ambas as extensões no mesmo schema. Para usar o smlar junto com o rum, instale-os em schemas separados.
Remoção:
DROP EXTENSION smlar;
Calcular similaridade de arrays
Similaridade básica — mesmo tipo de dado:
SELECT smlar('{3,2}'::int[], '{3,2,1}');
smlar
----------
0.816497
(1 row)
Fórmula personalizada:
SELECT smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / (N.a + N.b)' );
smlar
----------
0.333333
(1 row)
Na fórmula, N.i representa a quantidade de elementos idênticos (interseção), N.a indica o número de elementos únicos no primeiro array e N.b corresponde aos elementos únicos do segundo array.
Teste de similaridade baseado em limiar:
Utilize o operador % para verificar se a similaridade entre dois arrays supera o limiar definido por smlar.threshold:
-- Set the threshold
SET smlar.threshold = 0.6;
-- Confirm the current value
SHOW smlar.threshold;
smlar.threshold
-----------------
0.6
(1 row)
-- Test similarity (returns TRUE or FALSE)
SELECT '{3,2}'::int[] % '{3,2,1}'::int[];
Funções e operadores
|
Função ou operador |
Descrição |
|
|
Calcula a similaridade entre dois arrays do mesmo tipo de dado. |
|
|
Determina a similaridade de dois arrays de um tipo composto personalizado (pares de elemento e peso). Defina |
|
|
Obtém a similaridade por meio de uma fórmula customizada. Variáveis predefinidas: |
|
|
Retorna |
|
|
Converte um valor |
|
|
Ordena e remove elementos duplicados do array. |
|
|
Devolve |
|
|
Fornece o terceiro argumento caso o elemento esteja presente no array ou o quarto argumento na ausência dele. |
Parâmetros
Configure os parâmetros usando o comando SET do PostgreSQL ou no arquivo postgresql.conf.
Parâmetros gerais
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
|
FLOAT |
— |
Pontuação mínima de similaridade para que o operador |
|
|
BOOL |
— |
Define se as estatísticas globais em cache devem ser armazenadas em memória independente de transação. |
|
|
STRING |
|
Algoritmo de similaridade utilizado. Valores válidos: |
Parâmetros de TF-IDF
Estes parâmetros aplicam-se somente quando smlar.type = 'tfidf'.
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
|
STRING |
— |
Nome da tabela que armazena estatísticas no nível da coleção. Crie-a com: |
|
|
STRING |
|
Método de cálculo da frequência do termo (TF). Opções válidas: |
|
|
BOOL |
|
Fórmula da frequência inversa de documentos (IDF). O valor |