Apakah semua pertanyaan harus ada dalam kamus?
Tidak. Karena hanya kata batang (sesuai dengan konfigurasi pencarian teks yang digunakan ) yang ada dalam indeks untuk memulai. Tetapi yang lebih penting:
Tidak ada . Karena, di atas itu Pencarian Teks Lengkap juga mampu mencocokkan awalan :
Ini akan berhasil:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
Perhatikan 3 hal:
Gunakan to_tsquery()
, bukan plainto_tsquery()
, dalam hal ini karena ( mengutip manual ):
... plainto_tsquery
tidak akan mengenali tsquery
operator, label bobot, atau label kecocokan awalan dalam inputnya
Gunakan 'simple'
konfigurasi pencarian teks untuk menghasilkan tsquery
karena Anda jelas ingin mengambil kata 'faedah' apa adanya dan tidak berlaku stemming.
Tambahkan :*
untuk menjadikannya pencarian awalan, yaitu menemukan semua leksem dimulai dengan 'tersedia'.
Penting: Ini adalah pencarian awalan pada leksem (batang kata) dalam dokumen. Pencocokan ekspresi reguler tanpa wildcard ( content ~* 'avail'
) tidak persis sama! Yang terakhir ini tidak berlabuh kiri (ke awal leksem) dan juga akan menemukan 'FOOavail' dll.
Tidak jelas apakah Anda ingin perilaku yang diuraikan dalam kueri Anda atau yang setara dengan ekspresi reguler yang ditambahkan. Indeks trigram ( pg_trgm
) seperti @Evan sudah disarankan adalah alat yang tepat untuk itu. Ada banyak pertanyaan terkait di dba.SE, coba cari .
Gambaran:
Demo
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
Jawaban terkait baru-baru ini (bab Pendekatan berbeda untuk mengoptimalkan pencarian ):
Email?
Karena Anda menyebutkan email, ketahuilah bahwa parser pencarian teks mengidentifikasi email dan tidak membaginya menjadi kata / leksem yang terpisah. Mempertimbangkan:
SELECT ts_debug('english', '[email protected]')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
Saya akan mengganti pemisah @
dan .
dalam email Anda dengan space ( ' '
) untuk mengindeks kata-kata yang terkandung.
Juga, karena Anda berurusan dengan nama dalam email, bukan dengan kata-kata bahasa Inggris (atau bahasa lain) , saya akan menggunakan 'simple'
konfigurasi pencarian teks untuk menonaktifkan fitur stemming dan bahasa lainnya :
Bangun ts_vector
kolom dengan:
SELECT to_tsvector('simple', translate('[email protected]', '@.', ' ')) AS tsv;
:*
didokumentasikan, dan 2) tidak boleh menyebutkan untuk membangunto_tsvector('simple'..)
datang bersama-sama dengan instruksi bahwa permintaan masa depan tsv itu akan memerlukan konfigurasi 'sederhana' juga untuk pembuatan? Saya pikir Anda harus mengklarifikasi konsekuensi penonaktifan yang berasal dari tsvector / tsquery.0.380ms
untuk mendapatkan hasil. Setelah cara Anda mengambil0.079 ms
.pg_trgm
. FTS lebih cepat (dengan indeks yang lebih kecil). Anda bahkan dapat menggabungkan kedua indeks ...