日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

pg_bigm是PolarDB PostgreSQL版(兼容Oracle)的一款插件,該插件提供了全文本搜索能力,允許創建一個二元語法(2-gram)的GIN索引來加速搜索過程。

與pg_trgm異同

pg_trgm是PolarDB PostgreSQL版(兼容Oracle)的另一款插件,使用3-gram的模型來實現全文本搜索。pg_bigm插件是在pg_trgm基礎上繼續開發的,兩者的區別如下。

功能和特性

pg_trgm

pg_bigm

全文搜索的短語匹配方法

3-gram

2-gram

支持的索引類型

GIN和GIST

GIN

支持的全文本搜索操作符號

LIKEILIKE~~*

LIKE

非字母語言的全文本搜索

不支持

支持

帶有1~2個字符的關鍵字的全文本搜索

相似性搜索

支持

支持

最大可以索引的列大小

238,609,291字節(約228 MB)

107,374,180字節(約102 MB)

注意事項

  • 建立GIN索引的列的長度不可以超過107,374,180字節(約102 MB)。示例如下:

    CREATE TABLE t1 (description text);
    
    CREATE INDEX t1_idx ON t1 USING gin (description gin_bigm_ops);
    
    INSERT INTO t1 SELECT repeat('A', 107374181);
  • 如果數據庫中存儲的內容語言是非ASCII,則建議將數據庫的編碼方式改為UTF8。查詢當前數據庫編碼方式的命令如下:

    SELECT pg_encoding_to_char(encoding)
    FROM pg_database
    WHERE datname = current_database();

基本操作

  • 創建插件

    CREATE EXTENSION pg_bigm;
  • 加載插件到內存

    LOAD 'pg_bigm';
    說明

    該命令只對當前會話有效。

  • 創建索引

    CREATE TABLE pg_tools (tool text, description text);
    
    INSERT INTO pg_tools VALUES ('pg_hint_plan', 'Tool that allows a user to specify an optimizer HINT to PostgreSQL');
    INSERT INTO pg_tools VALUES ('pg_dbms_stats', 'Tool that allows a user to stabilize planner statistics in PostgreSQL');
    INSERT INTO pg_tools VALUES ('pg_bigm', 'Tool that provides 2-gram full text search capability in PostgreSQL');
    INSERT INTO pg_tools VALUES ('pg_trgm', 'Tool that provides 3-gram full text search capability in PostgreSQL');
    
    CREATE INDEX pg_tools_idx ON pg_tools USING gin (description gin_bigm_ops);
    CREATE INDEX pg_tools_multi_idx ON pg_tools USING gin (tool gin_bigm_ops, description gin_bigm_ops) WITH (FASTUPDATE = off);
  • 執行全文本搜索

    SELECT * FROM pg_tools WHERE description LIKE '%search%';

    顯示結果如下:

      tool   |                             description
    ---------+---------------------------------------------------------------------
     pg_bigm | Tool that provides 2-gram full text search capability in PostgreSQL
     pg_trgm | Tool that provides 3-gram full text search capability in PostgreSQL
    (2 rows)
  • 使用=%操作符執行相似性搜索

    SET pg_bigm.similarity_limit TO 0.2;
    # 顯示結果如下:
    SET
    
    SELECT tool FROM pg_tools WHERE tool =% 'bigm';
    # 顯示結果如下:
      tool
    ---------
     pg_bigm
     pg_trgm
    (2 rows)
  • 卸載插件

    DROP EXTENSION pg_bigm;

插件常用函數

  • likequery函數

    • 作用:生成可以被LIKE關鍵字識別的字符串。

    • 參數:1個請求參數,類型為字符串。

    • 返回值:可以被LIKE關鍵字識別的搜索字符串。

    • 實現原理:

      • 在關鍵詞前后添加%符號。

      • 使用\來自動轉義符號%

    • 示例如下:

      SELECT likequery('pg_bigm has improved the full text search performance by 200%');
      # 顯示結果如下:
                                   likequery
      -------------------------------------------------------------------
       %pg\_bigm has improved the full text search performance by 200\%%
      (1 row)
      
      SELECT * FROM pg_tools WHERE description LIKE likequery('search');
      # 顯示結果如下:
        tool   |                             description
      ---------+---------------------------------------------------------------------
       pg_bigm | Tool that provides 2-gram full text search capability in PostgreSQL
       pg_trgm | Tool that provides 3-gram full text search capability in PostgreSQL
      (2 rows)
  • show_bigm函數

    • 作用:返回給定字符串的所有2-gram元素的集合。

    • 參數:1個請求參數,類型為字符串。

    • 返回值:數組,包含所有的2-gram元素。

    • 實現原理:

      • 在字符串前后添加空格字符。

      • 計算所有的2-gram子串。

    • 示例如下:

      SELECT show_bigm('full text search');

      顯示結果如下:

                                  show_bigm
      ------------------------------------------------------------------
       {" f"," s"," t",ar,ch,ea,ex,fu,"h ","l ",ll,rc,se,"t ",te,ul,xt}
      (1 row)
  • bigm_similarity函數

    • 作用:計算兩個字符串的相似度。

    • 參數:2個請求參數,類型為字符串。

    • 返回值:浮點數,表示相似度。

    • 實現原理:

      • 統計兩個字符串共有的2-gram元素。

      • 相似度范圍是[0, 1],0代表兩個字符串完全不一樣,1代表兩個字符串一樣。

      說明
      • 由于計算2-gram時,會在字符串前后添加空格,于是ABCB的相似度為0,ABCA的相似度為0.25。

      • bigm_similarity函數是大小寫敏感的,例如,ABCabc的相似度為0。

    • 示例如下:

      SELECT bigm_similarity('full text search', 'text similarity search');
      # 顯示結果如下:
       bigm_similarity
      -----------------
             0.5714286
      (1 row)
      
      SELECT bigm_similarity('ABC', 'A');
      # 顯示結果如下:
       bigm_similarity
      -----------------
                  0.25
      (1 row)
      
      SELECT bigm_similarity('ABC', 'B');
      # 顯示結果如下:
       bigm_similarity
      -----------------
                     0
      (1 row)
      
      SELECT bigm_similarity('ABC', 'abc');
      # 顯示結果如下:
       bigm_similarity
      -----------------
                     0
      (1 row)
  • pg_gin_pending_stats函數

    • 作用:返回GIN索引的pending list中頁面和元組的個數。

    • 參數:1個,GIN索引的名字或者OID。

    • 返回值:2個,pending list中頁面的數量和元組的數量。

      說明

      如果GIN索引創建時,指定參數FASTUPDATEFalse,則該GIN索引不存在pending list,即返回結果為0。

    • 示例如下:

      SELECT * FROM pg_gin_pending_stats('pg_tools_idx');

      顯示結果如下:

       pages | tuples
      -------+--------
           0 |      0
      (1 row)

插件行為控制參數

  • pg_bigm.last_update

    該插件的最后更新日期,只讀參數,無法修改。

    示例如下:

    SHOW pg_bigm.last_update;
  • pg_bigm.enable_recheck

    決定是否進行recheck。

    說明

    建議您保持默認值(ON)以保證結果正確性。

    示例如下:

    CREATE TABLE tbl (doc text);
    # 顯示結果如下:
    CREATE TABLE
    
    INSERT INTO tbl VALUES('He is awaiting trial');
    # 顯示結果如下:
    INSERT 0 1
    
    INSERT INTO tbl VALUES('It was a trivial mistake');
    # 顯示結果如下:
    INSERT 0 1
    
    CREATE INDEX tbl_idx ON tbl USING gin (doc gin_bigm_ops);
    # 顯示結果如下:
    CREATE INDEX
    
    SET enable_seqscan TO off;
    # 顯示結果如下:
    SET
    
    EXPLAIN ANALYZE SELECT * FROM tbl WHERE doc LIKE likequery('trial');
    # 顯示結果如下:
                                                       QUERY PLAN
    -----------------------------------------------------------------------------------------------------------------
     Bitmap Heap Scan on tbl  (cost=20.00..24.01 rows=1 width=32) (actual time=0.020..0.021 rows=1 loops=1)
       Recheck Cond: (doc ~~ '%trial%'::text)
       Rows Removed by Index Recheck: 1
       Heap Blocks: exact=1
       ->  Bitmap Index Scan on tbl_idx  (cost=0.00..20.00 rows=1 width=0) (actual time=0.013..0.013 rows=2 loops=1)
             Index Cond: (doc ~~ '%trial%'::text)
     Planning Time: 0.117 ms
     Execution Time: 0.043 ms
    (8 rows)
    
    SELECT * FROM tbl WHERE doc LIKE likequery('trial');
    # 顯示結果如下:
             doc
    ----------------------
     He is awaiting trial
    (1 row)
    
    SET pg_bigm.enable_recheck = off;
    # 顯示結果如下:
    SET
    
    SELECT * FROM tbl WHERE doc LIKE likequery('trial');
    # 顯示結果如下:
               doc
    --------------------------
     He is awaiting trial
     It was a trivial mistake
    (2 rows)
                        
  • pg_bigm.gin_key_limit

    限制用于全文本搜索的2-gram元素的最大個數,默認為0,0代表使用所有的2-gram元素。

    說明

    如果發現使用所有的2-gram元素導致性能下降,可以調整該參數值,限制2-gram元素的個數來提高性能。

  • pg_bigm.similarity_limit

    設置相似度閾值,相似度超過這個閾值的元組會做為相似性搜索的結果。