All Products
Search
Document Center

PolarDB:RUM

Last Updated:Jul 02, 2025

Ekstensi RUM memperluas indeks terbalik umum (GIN) dan mengimplementasikan pencarian teks penuh yang lebih cepat berdasarkan metode akses GIN.

Prasyarat

Kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle) Anda harus memenuhi persyaratan berikut:

PolarDB for PostgreSQL (Kompatibel dengan Oracle) 2.0 (versi revisi 2.0.14.3.0 atau lebih baru).

Catatan

Anda dapat mengeksekusi pernyataan berikut untuk menanyakan versi mesin minor dari kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle):

show polar_version;

Informasi Latar Belakang

GIN mendukung tipe data tsvector dan tsquery untuk mengimplementasikan pencarian teks penuh, tetapi memiliki beberapa kendala:

  • Pengurutan Lambat: Informasi lokasi kata diperlukan untuk pengurutan. Namun, GIN tidak menyimpan lokasi kata, sehingga pemindaian tambahan diperlukan setelah pemindaian indeks.

  • Pencarian Frasa Lambat: GIN memerlukan informasi lokasi untuk melakukan pencarian frasa.

  • Pengurutan Berdasarkan Waktu Lambat: GIN tidak menyimpan informasi morfem dalam indeks, sehingga pemindaian tambahan diperlukan.

Ekstensi RUM didasarkan pada GIN dan menyelesaikan masalah ini dengan menyimpan informasi tambahan (lokasi kata atau waktu) di indeks RUM.

Catatan

Namun, ekstensi RUM membutuhkan waktu lebih lama daripada GIN untuk membangun dan menyisipkan indeks karena RUM menghasilkan indeks berdasarkan log WAL dan indeks tersebut berisi lebih banyak informasi dibandingkan kunci enkripsi.

Operator RUM Umum

Ekstensi RUM menyediakan operator berikut:

Operator

Tipe Data

Deskripsi

tsvector <=> tsquery

float4

Menghitung jarak antara nilai tsvector dan tsquery.

timestamp <=> timestamp

float8

Menghitung jarak antara dua nilai timestamp.

timestamp <=| timestamp

float8

Menghitung jarak antara nilai yang kurang dari timestamp saat ini.

timestamp |=> timestamp

float8

Menghitung jarak antara nilai yang lebih besar dari timestamp saat ini.

Operator <=>, <=|, dan |=> juga berlaku untuk tipe data berikut:

  • timestamptz

  • int2

  • int4

  • int8

  • float4

  • float8

  • money

  • oid

Menggunakan Ekstensi RUM

Membuat Ekstensi RUM

Eksekusi pernyataan SQL berikut untuk menginstal ekstensi RUM:

CREATE EXTENSION rum;
Catatan

Jika ekstensi gagal dibuat ketika kluster Anda memenuhi persyaratan versi, hubungi kami.

Kelas Operator

  • Kelas rum_tsvector_ops menyimpan frasa tsvector dengan informasi lokasi dan mendukung pengurutan menggunakan operator <=> serta pencarian awalan.

    Contoh:

    1. Siapkan data:

      CREATE TABLE test_rum(t text, a tsvector);
      CREATE TRIGGER tsvectorupdate
          BEFORE UPDATE OR INSERT ON test_rum
          FOR EACH ROW
          EXECUTE PROCEDURE tsvector_update_trigger('a', 'pg_catalog.english', 't');
      INSERT INTO test_rum(t) VALUES ('The situation is most beautiful');
      INSERT INTO test_rum(t) VALUES ('It is a beautiful');
      INSERT INTO test_rum(t) VALUES ('It looks like a beautiful place');
    2. Buat indeks RUM:

      CREATE INDEX rumidx ON test_rum USING rum (a rum_tsvector_ops);
    3. Eksekusi pernyataan query berikut:

      • Pernyataan Query 1:

        SELECT t, a <=> to_tsquery('english', 'beautiful | place') AS rank
        FROM test_rum
        WHERE a @@ to_tsquery('english', 'beautiful | place')
        ORDER BY a <=> to_tsquery('english', 'beautiful | place');

        Hasil contoh:

                        t                |   rank
        ---------------------------------+----------
         It looks like a beautiful place |  8.22467
         The situation is most beautiful | 16.44934
         It is a beautiful               | 16.44934
        (3 rows)
      • Pernyataan Query 2:

        SELECT t, a <=> to_tsquery('english', 'place | situation') AS rank
        FROM test_rum
        WHERE a @@ to_tsquery('english', 'place | situation')
        ORDER BY a <=> to_tsquery('english', 'place | situation');

        Hasil contoh:

                        t                |   rank
        ---------------------------------+----------
         The situation is most beautiful | 16.44934
         It looks like a beautiful place | 16.44934
        (2 rows)
  • Kelas rum_tsvector_hash_ops menyimpan nilai hash dan informasi lokasi frasa tsvector. Kelas ini mendukung pengurutan menggunakan operator <=>, tetapi tidak mendukung pencarian awalan.

    Catatan

    Kelas rum_tsvector_hash_ops mendukung pengurutan menggunakan operator <=>, <=|, dan |=>. Ini dapat digunakan bersama dengan kelas rum_tsvector_addon_ops, rum_tsvector_hash_addon_ops, dan rum_anyarray_addon_ops.

  • Kelas rum_TYPE_ops mendukung tipe data dan operator berikut:

    Tipe data: int2, int4, int8, float4, float8, money, oid, time, timetz, date, interval, macaddr, inet, cidr, text, varchar, char, bytea, bit, varbit, numeric, timestamp, dan timestamptz.

    Operator: Operator <, <=, =, >=, dan > berlaku untuk semua tipe data. Operator <=>, <=|, dan |=> berlaku untuk tipe data int2, int4, int8, float4, float8, money, oid, timestamp, dan timestamptz.

  • Kelas rum_tsvector_addon_ops menyimpan leksem tsvector dan leksem apa pun yang didukung oleh bidang modul.

    Contoh:

    1. Siapkan data:

      CREATE TABLE tsts (id int, t tsvector, d timestamp);
      \copy tsts from 'external/rum/data/tsts.data'
      CREATE INDEX tsts_idx ON tsts USING rum (t rum_tsvector_addon_ops, d) WITH (attach = 'd', to = 't');
    2. Eksekusi pernyataan berikut:

      EXPLAIN (costs off)
      SELECT id, d, d <=> '2016-05-16 14:21:25'
      FROM tsts
      WHERE t @@ 'wr&qh'
      ORDER BY d <=> '2016-05-16 14:21:25'
      LIMIT 5;
      
                                          QUERY PLAN
      -----------------------------------------------------------------------------------
       Limit
         ->  Index Scan using tsts_idx on tsts
               Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
               Order By: (d <=> '2016-05-16 14:21:25'::timestamp without time zone)
      (4 rows)
    3. Eksekusi pernyataan query berikut:

      SELECT id, d, d <=> '2016-05-16 14:21:25'
      FROM tsts
      WHERE t @@ 'wr&qh'
      ORDER BY d <=> '2016-05-16 14:21:25'
      LIMIT 5;

      Hasil contoh:

       id  |             d              |   ?column?
      -----+----------------------------+---------------
       355 | 2016-05-16 14:21:22.326724 |      2.673276
       354 | 2016-05-16 13:21:22.326724 |   3602.673276
       371 | 2016-05-17 06:21:22.326724 |  57597.326724
       406 | 2016-05-18 17:21:22.326724 | 183597.326724
       415 | 2016-05-19 02:21:22.326724 | 215997.326724
      (5 rows)
      Catatan

      Karena pohon posting memiliki batas kanan panjang tetap dan item posting non-daun panjang tetap, RUM mungkin memiliki kekurangan dalam membuat indeks menggunakan pengurutan atas informasi tambahan yang dilewati referensi.

  • Kelas rum_tsvector_hash_addon_ops menyimpan nilai hash leksem tsvector dan leksem apa pun yang didukung oleh bidang modul.

  • Kelas rum_tsquery_ops berlaku untuk tipe data tsquery dan menyimpan cabang pohon kueri dalam informasi tambahan.

    Contoh:

    1. Siapkan data:

      CREATE TABLE test_array (i int2[]);
      INSERT INTO test_array VALUES ('{}'), ('{0}'), ('{1,2,3,4}'), ('{1,2,3}'), ('{1,2}'), ('{1}');
      CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
    2. Eksekusi pernyataan berikut:

      SET enable_seqscan TO off;
      EXPLAIN (COSTS OFF)
      SELECT *
      FROM test_array
      WHERE i && '{1}'
      ORDER BY i <=> '{1}' ASC;
      
                      QUERY PLAN
      ------------------------------------------
       Index Scan using idx_array on test_array
         Index Cond: (i && '{1}'::smallint[])
         Order By: (i <=> '{1}'::smallint[])
      (3 rows)
    3. Eksekusi pernyataan query berikut:

      SELECT *
      FROM test_array
      WHERE i && '{1}'
      ORDER BY i <=> '{1}' ASC;

      Hasil contoh:

           i
      -----------
       {1}
       {1,2}
       {1,2,3}
       {1,2,3,4}
      (4 rows)
  • Kelas rum_anyarray_ops menyimpan elemen anyarray dengan panjang array. Operator yang didukung termasuk &&, @>, <@, =, dan %. Pengurutan menggunakan operator <=> didukung.

    Contoh:

    1. Siapkan data:

      CREATE TABLE test_array (i int2[]);
      INSERT INTO test_array VALUES ('{}'), ('{0}'), ('{1,2,3,4}'), ('{1,2,3}'), ('{1,2}'), ('{1}');
      CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
    2. Eksekusi pernyataan berikut:

      SET enable_seqscan TO off;
      
      EXPLAIN (COSTS OFF)
      SELECT *
      FROM test_array
      WHERE i && '{1}'
      ORDER BY i <=> '{1}' ASC;
      
                      QUERY PLAN
      ------------------------------------------
       Index Scan using idx_array on test_array
         Index Cond: (i && '{1}'::smallint[])
         Order By: (i <=> '{1}'::smallint[])
      (3 rows)
    3. Eksekusi pernyataan query berikut:

      SELECT *
      FROM test_array
      WHERE i && '{1}'
      ORDER BY i <=> '{1}' ASC;

      Hasil contoh:

           i
      -----------
       {1}
       {1,2}
       {1,2,3}
       {1,2,3,4}
      (4 rows)
  • Kelas rum_anyarray_addon_ops menyimpan elemen anyarray dan elemen apa pun yang didukung oleh bidang modul.

Menghapus Ekstensi RUM

Eksekusi pernyataan SQL berikut untuk menghapus ekstensi RUM:

DROP EXTENSION rum;

Referensi

Untuk informasi lebih lanjut, lihat rum.