Ekstensi zhparser memungkinkan pencarian teks penuh untuk bahasa Tionghoa pada ApsaraDB RDS for PostgreSQL. Berbeda dengan bahasa Inggris, teks bahasa Tionghoa tidak memiliki spasi antar kata, sehingga parser bawaan PostgreSQL tidak dapat melakukan segmentasi secara tepat. zhparser melakukan segmentasi teks bahasa Tionghoa berdasarkan semantik, sehingga memungkinkan pengindeksan dan pencarian teks penuh yang akurat.
Prasyarat
Sebelum memulai, pastikan bahwa:
Instans RDS menjalankan PostgreSQL 10 atau versi yang lebih baru.
Versi mesin minor adalah 20230830 atau lebih baru. Untuk PostgreSQL 17, versi mesin minor harus 20241030 atau lebih baru.
zhparsertelah ditambahkan ke parametershared_preload_librariesinstans. Untuk petunjuknya, lihat Modifikasi parameter instans ApsaraDB RDS for PostgreSQL.
Ekstensi baru dan yang dibuat ulang memerlukan versi mesin minor 20230830 atau lebih baru. Jika instans Anda menjalankan versi sebelumnya, perbarui terlebih dahulu sebelum membuat ekstensi. Lihat Perbarui versi mesin minor. Jika ekstensi sudah terpasang pada versi sebelumnya, ekstensi tersebut tetap berfungsi. Untuk informasi selengkapnya, lihat [Perubahan produk/Perubahan fitur] Batasan pembuatan ekstensi untuk instans ApsaraDB RDS for PostgreSQL.
Aktifkan zhparser
Jalankan pernyataan berikut untuk membuat ekstensi dan mengonfigurasi konfigurasi pencarian teks bernama testzhcfg:
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
-- Opsional: aktifkan komposisi kata pendek untuk segmentasi yang lebih granular
ALTER ROLE CURRENT_ROLE SET zhparser.multi_short=on;Baris ADD MAPPING FOR n,v,a,i,e,l memetakan enam tipe token inti (n, v, a, i, e, l) ke kamus simple.
Verifikasi segmentasi
Pencarian teks penuh PostgreSQL menggunakan tiga fungsi utama:
| Fungsi | Tujuan | Contoh input → output |
|---|---|---|
ts_parse() | Mengembalikan output token mentah beserta ID tipe tokennya | Token mentah dari parser |
to_tsvector() | Mengonversi teks menjadi leksem ternormalisasi untuk pengindeksan | Teks → daftar leksem terindeks |
to_tsquery() | Mengonversi frasa menjadi ekspresi kueri | Frasa → kueri untuk pencocokan terhadap tsvector |
Untuk memverifikasi bahwa zhparser melakukan segmentasi teks dengan benar, jalankan kueri uji berikut:
-- Uji output token mentah
-- Mengembalikan set hasil (tokid, token), di mana tokid mengidentifikasi tipe token
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了 保 障 房 的 建 设 和 投 入 力 度 。 2011年,保障房进入了更大规模的建设阶段。 住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。 ');
-- Konversi teks menjadi tsvector (daftar leksem ternormalisasi yang digunakan untuk pengindeksan)
SELECT to_tsvector('testzhcfg','"今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。"陈国强说。 在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。 ');
-- Konversi frasa pencarian menjadi tsquery untuk digunakan dengan operator @@
SELECT to_tsquery('testzhcfg', '保障房资金压力');Buat indeks teks penuh dan jalankan kueri
Setelah mengaktifkan zhparser, buat indeks GIN (Generalized Inverted Index) pada kolom yang akan dicari. Contoh berikut membuat indeks teks penuh pada kolom name tabel t1:
-- Ganti t1 dan name dengan nama tabel dan kolom aktual Anda
CREATE INDEX idx_t1 ON t1 USING gin (to_tsvector('testzhcfg', upper(name)));Gunakan operator @@ untuk mencocokkan baris terhadap kueri pencarian:
SELECT * FROM t1 WHERE to_tsvector('testzhcfg', upper(t1.name)) @@ to_tsquery('testzhcfg', '(防火)');Indeks dan klausa WHERE harus menggunakan ekspresi yang sama — to_tsvector('testzhcfg', upper(name)) — agar PostgreSQL dapat menggunakan indeks selama eksekusi kueri.
Tambahkan segmen kata kustom
Untuk menambahkan istilah spesifik domain yang tidak disegmentasi dengan benar oleh kamus bawaan, masukkan istilah tersebut ke dalam pg_ts_custom_word.
Contoh berikut menambahkan 保障房资 sebagai satu segmen kata:
-- Periksa hasil segmentasi saat ini
SELECT to_tsquery('testzhcfg', '保障房资金压力');
-- Tambahkan segmen kata baru
INSERT INTO pg_ts_custom_word VALUES ('保障房资');
-- Sinkronkan kamus untuk menerapkan perubahan
SELECT zhprs_sync_dict_xdb();
-- Sambungkan ulang ke database (sesi baru akan menggunakan kamus yang diperbarui)
\c
-- Verifikasi hasil segmentasi baru
SELECT to_tsquery('testzhcfg', '保障房资金压力');Setelah menambahkan, menghapus, atau mengubah segmen kata, Anda harus memanggil zhprs_sync_dict_xdb() dan menyambungkan ulang ke database agar perubahan diterapkan. Perubahan tidak berlaku untuk sesi yang sudah ada.
Batasan kamus kustom
| Batasan | Nilai |
|---|---|
| Jumlah maksimum segmen kata kustom | 1.000.000 |
| Panjang maksimum per segmen kata | 128 byte |
Jika jumlah segmen kata melebihi 1.000.000, segmen kata yang melebihi batas tersebut akan diabaikan. Segmen kata yang lebih panjang dari 128 byte akan dipotong pada byte ke-128.
Kamus kustom dan kamus bawaan aktif secara bersamaan.