Saya telah menemukan pencarian teks lengkap di postgres dalam beberapa hari terakhir, dan saya agak bingung tentang pengindeksan ketika mencari di beberapa kolom.
Postgres docs berbicara tentang menciptakan ts_vector
indeks pada kolom bersambung, seperti:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
yang bisa saya cari seperti ini:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Namun, jika saya ingin kadang-kadang mencari hanya judul, kadang-kadang hanya tubuh, dan kadang-kadang keduanya, saya akan membutuhkan 3 indeks terpisah. Dan jika saya menambahkan di kolom ketiga, itu berpotensi menjadi 6 indeks, dan seterusnya.
Alternatif yang belum saya lihat dalam dokumen adalah hanya untuk mengindeks dua kolom secara terpisah, dan kemudian hanya menggunakan WHERE...OR
permintaan normal :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Membandingkan dua baris pada ~ 1 juta baris pada dasarnya tidak memiliki perbedaan dalam kinerja.
Jadi pertanyaan saya adalah:
Mengapa saya ingin menggabungkan indeks seperti ini, daripada hanya mengindeks kolom secara individual? Apa kelebihan / kekurangan keduanya?
Tebakan terbaik saya adalah bahwa jika saya tahu sebelumnya saya hanya ingin mencari kedua kolom (tidak pernah satu per satu) saya hanya akan memerlukan satu indeks dengan menggabungkan yang menggunakan lebih sedikit memori.
sumber
title
ke dalambody
dan kemudian pengindeksan yang akan memberi banyak nilai, meskipun saya terbuka untuk koreksi. Saya mungkin hanya akan tetap dengan mengindeks mereka secara terpisah. Juga, jika itu adalah beberapa kali aneh yang entah bagaimana mengharuskan Anda untuk menyatukan, maka saya kira Anda bisa menjalankan kueri ad-hoc.Jawaban:
Tidak, Anda tidak perlu indeks terpisah. Gunakan fitur bobot. Itu hanya label yang bisa Anda tolak. Anda dapat memiliki hingga empat label untuk ditanyakan (AD).
Anda mungkin ingin menyatukan vektor, sehingga Anda dapat secara terpisah menerapkan bobotnya dan kemudian menyatukannya:
sumber
Sebenarnya alternatifnya adalah menggunakan di mana dengan OR , dan bukan AND .
Jika Anda memiliki indeks pada tsvector (tubuh + judul), dan Anda mencari di dalamnya, kata-kata yang dicari bisa dalam judul ATAU di dalam tubuh.
Juga - saat menguji, pastikan Anda memiliki jumlah baris yang masuk akal dalam tabel.
Kasus paling sederhana yang harus menunjukkan perbedaan yang baik: temukan dua kata - salah satunya yang sangat mungkin dalam judul. dan yang lainnya - yang sangat mungkin ada di dalam tubuh. Tetapi pastikan tidak banyak baris yang cocok dengan kedua kriteria. Misalnya - Anda mungkin memiliki 30% kata "depesz" di badan. Anda juga memiliki ~ 30% kemungkinan memiliki "mysql" dalam judul. Tetapi memiliki "depesz dan mysql" di salah satu bidang di baris yang sama sangat tidak mungkin. Dan kemudian periksa kinerja dengan indeks tersebut.
sumber