Parser teks bawaan PostgreSQL memisahkan input berdasarkan spasi dan tanda baca, yang efektif untuk bahasa Eropa karena batas kata ditandai dengan spasi. Namun, teks bahasa Tiongkok tidak memiliki spasi antar kata, sehingga parser bawaan memperlakukan seluruh kalimat sebagai satu token dan tidak dapat mencocokkan kata-kata individual. Ekstensi zhparser mengatasi keterbatasan ini dengan menerapkan leksikon khusus bahasa Tiongkok dan algoritma segmentasi, sehingga memungkinkan pencarian teks penuh pada konten berbahasa Tiongkok di AnalyticDB for PostgreSQL.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans AnalyticDB for PostgreSQL
Ekstensi zhparser yang telah diinstal pada halaman Extensions instans Anda (lihat Install, update, and uninstall extensions)
Cara kerja pencarian teks penuh di PostgreSQL
Pencarian teks penuh di PostgreSQL bergantung pada dua tipe data:
tsvector — representasi dokumen yang telah diproses sebelumnya, menyimpan leksem ternormalisasi beserta posisinya
tsquery — ekspresi kueri pencarian
Dua pola kueri umum:
Kueri langsung:
SELECT name FROM <table>
WHERE to_tsvector('english', name) @@ to_tsquery('english', 'friend');Dengan indeks Generalized Inverted Index (GIN) untuk performa lebih baik:
CREATE INDEX <idx_name> ON <table> USING gin(to_tsvector('english', name));Setelah Anda mengonfigurasi zhparser, ganti 'english' dengan 'zh_cn' pada kedua pola tersebut untuk mengaktifkan segmentasi bahasa Tiongkok.
Konfigurasi zhparser
Langkah 1: Buat konfigurasi pencarian teks
Setelah menginstal ekstensi, buat konfigurasi pencarian teks bernama zh_cn yang menggunakan zhparser sebagai parser-nya:
CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser);Untuk memverifikasi bahwa konfigurasi telah dibuat, jalankan \dF atau \dFp di psql.
Langkah 2: Tinjau tipe token yang tersedia
zhparser mengklasifikasikan teks bahasa Tiongkok ke dalam 26 tipe token. Jalankan perintah berikut untuk melihat daftarnya:
SELECT ts_token_type('zhparser');Output menampilkan semua tipe yang tersedia:
tokid | alias | description
-------+-------+--------------------
97 | a | adjective
98 | b | differentiation
99 | c | conjunction
100 | d | adverb
101 | e | exclamation
102 | f | position
103 | g | root
104 | h | head
105 | i | idiom
106 | j | abbreviation
107 | k | tail
108 | l | tmp
109 | m | numeral
110 | n | noun
111 | o | onomatopoeia
112 | p | prepositional
113 | q | quantity
114 | r | pronoun
115 | s | space
116 | t | time
117 | u | auxiliary
118 | v | verb
119 | w | punctuation
120 | x | unknown
121 | y | modal
122 | z | status
(26 rows)Untuk memeriksa konfigurasi zh_cn saat ini:
SELECT * FROM pg_ts_config_map
WHERE mapcfg = (SELECT oid FROM pg_ts_config WHERE cfgname = 'zh_cn');Langkah 3: Petakan tipe token ke kamus
Tambahkan pemetaan untuk menentukan tipe token mana yang diindeks. Contoh berikut memetakan kata benda, kata kerja, kata sifat, idiom, seruan, dan idiom sementara ke kamus simple:
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR n,v,a,i,e,l WITH simple;Untuk menghapus pemetaan tersebut:
ALTER TEXT SEARCH CONFIGURATION zh_cn DROP MAPPING IF EXISTS FOR n,v,a,i,e,l;Langkah 4: Verifikasi segmentasi
Uji to_tsvector dan to_tsquery dengan konfigurasi zh_cn:
SELECT to_tsvector('zh_cn', '有两种方法进行全文检索'); to_tsvector
--------------------------------------
'全文检索':4 '方法':2 '有':1 '进行':3
(1 row)SELECT to_tsquery('zh_cn', '有两种方法进行全文检索'); to_tsquery
-------------------------------------
'有' & '方法' & '进行' & '全文检索'
(1 row)Kamus kustom
zhparser mendukung tabel kamus kustom — zhparser.zhprs_custom_word — untuk menambahkan istilah spesifik domain atau stop word. Tabel ini dibuat secara otomatis saat Anda menginstal ekstensi.
Struktur tabel
CREATE TABLE zhparser.zhprs_custom_word
(
word text PRIMARY KEY, -- Kata kustom
tf FLOAT DEFAULT '1.0', -- Frekuensi istilah (TF). Default: 1.0.
idf FLOAT DEFAULT '1.0', -- Frekuensi invers dokumen (IDF). Default: 1.0.
attr CHAR DEFAULT '@', CHECK(attr = '@' OR attr = '!') -- Jenis kata: @ (kata baru), ! (stop word).
);Konfigurasi kamus kustom
Tambahkan pemetaan agar token unknown (tipe x) dicari di kamus kustom:
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR x WITH simple;Tambah dan hapus kata
Tambahkan kata ke kamus kustom:
INSERT INTO zhparser.zhprs_custom_word(word, attr) VALUES('两种方法', '@');Hapus kata:
DELETE FROM zhparser.zhprs_custom_word WHERE word = '两种方法';Kueri semua entri:
SELECT * FROM zhparser.zhprs_custom_word;Muat ulang dan verifikasi
Setelah melakukan perubahan apa pun pada zhparser.zhprs_custom_word, muat ulang tabel agar perubahan diterapkan:
SELECT sync_zhprs_custom_word();Jalankan kueri yang sama sebelum dan sesudah untuk mengonfirmasi efeknya:
SELECT to_tsvector('zh_cn', '有两种方法进行全文检索');Sebelum menambahkan `两种方法` — frasa tersebut dipisah menjadi token individual:
to_tsvector
--------------------------------------
'全文检索':4 '方法':2 '有':1 '进行':3
(1 row)Setelah menambahkan `两种方法` — frasa tersebut diperlakukan sebagai satu kesatuan:
to_tsvector
----------------------------------------------
'两种方法':2 '全文检索':4 '有':1 '进行':3
(1 row)Langkah selanjutnya
Full-Text Search — Referensi pencarian teks penuh PostgreSQL
Text Search Functions and Operators — fungsi dan operator untuk pencarian teks penuh