您可以通过在数据库内使用smlar插件来高效计算数据相似度,smlar插件还提供了支持GiST和GIN索引的相似度运算符。

前提条件

支持的PolarDB PostgreSQL版的版本如下:
  • PostgreSQL 14(内核小版本14.5.1.0及以上)
  • PostgreSQL 11(内核小版本1.1.28及以上)
说明 您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:
  • PostgreSQL 14
    select version();
  • PostgreSQL 11
    show polar_version;

简介

smlar是PolarDB PostgreSQL版的一款开源第三方插件,提供了可以在数据库内高效计算数据相似度的函数,并提供了支持GiST和GIN索引的相似度运算符。目前smlar插件已经支持PostgreSQL所有的内置数据类型。

使用指南

  1. 安装插件。
    CREATE EXTENSION smlar;
  2. 执行以下命令计算两个数组的相似度。
    SELECT smlar('{3,2}'::int[], '{3,2,1}');
      smlar
    ----------
     0.816497
    (1 row)
    
    SELECT smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / (N.a + N.b)' );
      smlar
    ----------
     0.333333
    (1 row)
    说明 其它函数使用方法,请参见函数及运算符介绍
  3. 卸载插件。
    DROP EXTENSION smlar;

函数及运算符介绍

函数及运算符说明
float4 smlar(anyarray, anyarray)计算两个相同数据类型数组的相似度,数组的数据类型需要一致。
float4 smlar(anyarray, anyarray, bool useIntersect)计算两个自定义复合类型(元素、权重)数组的相似度,useIntersect参数表示让仅重叠元素参与运算还是全部元素参与运算。
说明 复合类型定义方式如下:
CREATE TYPE type_name AS (element_name anytype, weight_name FLOAT4);
float4 smlar(anyarray a, anyarray b, text formula)计算两个相同数据类型数组的相似度,数组通过formula指定,数组的数据类型需要一致。formula的预定义变量说明如下:
  • N.i:两个数组中的相同元素个数(交集)。
  • N.a:第一个数组中的唯一元素个数。
  • N.b:第二个数组中的唯一元素个数。
anyarray % anyarray当两个数组的相似度超过阈值时返回TRUE;否则返回FALSE
text[] tsvector2textarray(tsvector)tsvector类型转换为字符串数组。
anyarray array_unique(anyarray)对数组进行排序、去重。
float4 inarray(anyarray, anyelement)如果元素出现在数组中,则返回1.0;否则返回0
float4 inarray(anyarray, anyelement, float4, float4)如果元素出现在数组中,则返回第三个参数;否则返回第四个参数。

可配置参数说明

参数说明
smlar.threshold FLOAT相似度阈值,用于给百分号(%)运算符判断两个数组是否相似。
smlar.persistent_cache BOOL全局统计信息的缓存是否存放在与事务无关的内存中。
smlar.type STRING相似度计算公式,可选的相似度类型包含:consine(默认)tfidfoverlap
smlar.stattable STRING存储集合范围统计信息的表名,表定义方式如下:
CREATE TABLE table_name (
  value   data_type UNIQUE,
  ndoc    int4 (or bigint)  NOT NULL CHECK (ndoc>0)
);
smlar.tf_method STRING计算词频TF(Term Frequency)的方法,取值如下:
  • n:简单计数(默认)。
  • log:1 + log(n)。
  • const:频率等于1。
smlar.idf_plus_one BOOL计算逆文本频率指数IDF(Inverse Document Frequency)的方法,取值如下:
  • FALSE:log(d / df)(默认)。
  • TRUE:log(1 + d / df)。

相关参考

smlar插件更多详细信息,请参见: