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.
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.