smlar插件可以用来计算两个相同类型数组的相似度。

前提条件

实例版本如下:
  • PostgreSQL 12(内核小版本20200421及以上)
  • PostgreSQL 11(内核小版本20200402及以上)
说明 您可以在基本信息页面的配置信息区域查看是否有升级内核小版本按钮。如果有按钮,您可以单击按钮查看当前版本;如果没有按钮,表示已经是最新版。详情请参见升级内核小版本
pgsql升级内核

背景信息

smlar插件提供多种函数计算两个相同类型数组的相似度,同时提供参数来控制相似度计算方法,目前支持所有内置的数据类型。

基本函数介绍

  • float4 smlar(anyarray, anyarray)

    计算两个相同数据类型数组的相似度。

  • float4 smlar(anyarray, anyarray, bool useIntersect)

    计算两个自定义复合类型(元素,权重)数组的相似度,复合类型如下:

    CREATE TYPE type_name AS (element_name anytype, weight_name FLOAT4);

    useIntersect为true时,计算过程只包含重叠元素的部分;为false时计算过程包含所有元素。

  • float4 smlar( anyarray a, anyarray b, text formula )

    计算两个相同数据类型数组的相似度,数组通过formula指定。

    formula的预定义变量说明如下:

    • N.i:两个数组的共有元素的个数。
    • N.a:数组a中不重复元素的个数。
    • N.b:数组b中不重复元素的个数。
  • float4 set_smlar_limit(float4)

    设置参数smlar.threshold的值。

  • float4 show_smlar_limit()

    查看参数smlar.threshold的值。

  • anyarray % anyarray

    如果两个数组的相似度大于参数smlar.threshold的值,返回true,否则返回false。

  • text[] tsvector2textarray(tsvector)

    转化tsvector类型为text。

  • anyarray array_unique(anyarray)

    对数组中的元素排序,排序结果不包含重复元素。

  • float4 inarray(anyarray, anyelement)

    如果anyelement存在于anyarray中,返回1,否则返回0。

  • float4 inarray(anyarray, anyelement, float4, float4)

    如果anyelement存在于anyarray中,返回第3个参数,否则返回第4个参数。

相关参数说明和支持的数据类型请参见smlar

使用插件

  • 连接实例后创建smlar插件,命令如下:
    testdb=> create extension smlar;
  • 验证插件基本功能,示例如下:
    testdb=> SELECT smlar('{1,4,6}'::int[], '{5,4,6}' );
      smlar   
    ----------
     0.666667
    (1 row)
    testdb=> SELECT smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / sqrt(N.a * N.b)' );
      smlar   
    ----------
     0.666667
    (1 row)
  • 卸载插件,命令如下:
    testdb=> drop extension smlar;