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

注意事项

由于smlar插件的%操作符与RUM插件的%操作符冲突,因此smlar与RUM两个插件无法同时创建在同一个schema中。

简介

smlar是PolarDB PostgreSQL版(兼容Oracle)的一款开源第三方插件,提供了可以在数据库内高效计算数据相似度的函数,并提供了支持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插件更多详细信息,请参见: