全部產品
Search
文件中心

PolarDB:smlar(近似向量)

更新時間:Oct 26, 2024

在電商業務、搜尋引擎中對大規模的資料進行相似性計算是一個很關鍵的技術問題。相對簡易的相似性計算實現不僅運算速度慢,還十分消耗資源。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外掛程式更多詳細資料,請參見: