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).
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.
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 |
| float4 | Menghitung jarak antara nilai |
| float8 | Menghitung jarak antara dua nilai timestamp. |
| float8 | Menghitung jarak antara nilai yang kurang dari timestamp saat ini. |
| float8 | Menghitung jarak antara nilai yang lebih besar dari timestamp saat ini. |
Operator <=>, <=|, dan |=> juga berlaku untuk tipe data berikut:
timestamptzint2int4int8float4float8moneyoid
Menggunakan Ekstensi RUM
Membuat Ekstensi RUM
Eksekusi pernyataan SQL berikut untuk menginstal ekstensi RUM:
CREATE EXTENSION rum;Jika ekstensi gagal dibuat ketika kluster Anda memenuhi persyaratan versi, hubungi kami.
Kelas Operator
Kelas
rum_tsvector_opsmenyimpan frasatsvectordengan informasi lokasi dan mendukung pengurutan menggunakan operator<=>serta pencarian awalan.Contoh:
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');Buat indeks RUM:
CREATE INDEX rumidx ON test_rum USING rum (a rum_tsvector_ops);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_opsmenyimpan nilai hash dan informasi lokasi frasatsvector. Kelas ini mendukung pengurutan menggunakan operator<=>, tetapi tidak mendukung pencarian awalan.CatatanKelas
rum_tsvector_hash_opsmendukung pengurutan menggunakan operator<=>,<=|, dan|=>. Ini dapat digunakan bersama dengan kelasrum_tsvector_addon_ops,rum_tsvector_hash_addon_ops, danrum_anyarray_addon_ops.Kelas
rum_TYPE_opsmendukung 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, dantimestamptz.Operator: Operator
<,<=,=,>=, dan>berlaku untuk semua tipe data. Operator<=>,<=|, dan|=>berlaku untuk tipe dataint2,int4,int8,float4,float8,money,oid,timestamp, dantimestamptz.Kelas
rum_tsvector_addon_opsmenyimpan leksemtsvectordan leksem apa pun yang didukung oleh bidang modul.Contoh:
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');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)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)CatatanKarena 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_opsmenyimpan nilai hash leksemtsvectordan leksem apa pun yang didukung oleh bidang modul.Kelas
rum_tsquery_opsberlaku untuk tipe datatsquerydan menyimpan cabang pohon kueri dalam informasi tambahan.Contoh:
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);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)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_opsmenyimpan elemenanyarraydengan panjang array. Operator yang didukung termasuk&&,@>,<@,=, dan%. Pengurutan menggunakan operator<=>didukung.Contoh:
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);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)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_opsmenyimpan elemenanyarraydan 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.