smlar(近似向量)

在电商业务、搜索引擎中对大规模的数据进行相似度计算是一个很关键的技术问题。相对简易的相似度计算实现不仅运算速度慢,还十分消耗资源。smlar是PolarDB PostgreSQL版(兼容Oracle)的一款开源第三方插件,提供了可以在数据库内高效计算数据相似度的函数,并提供了支持GiST和GIN索引的相似度运算符。目前smlar插件已经支持PostgreSQL所有的内置数据类型。

前提条件

支持的PolarDB PostgreSQL版(兼容Oracle)的版本如下:

Oracle语法兼容 2.0(内核小版本2.0.14.1.0及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版(兼容Oracle)的内核小版本号:

SHOW polar_version;

使用方法

  1. 安装插件。

    CREATE EXTENSION smlar;
    说明

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

  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

相似度计算公式,可选的相似度类型包含:cosine(默认)、tfidf、overlap。

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插件更多详细信息,请参见: