Son birkaç gün içinde postgres tam metin aramasıyla karşılaştım ve birden fazla sütun arasında arama yaparken dizin oluşturma konusunda biraz kafam karıştı.
Postgres dokümanlarıts_vector
, birleştirilmiş sütunlarda dizin oluşturma hakkında konuşur , şöyle:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
ki ben böyle arama yapabilirsiniz:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Ancak, bazen sadece başlığı, bazen sadece gövdeyi ve bazen her ikisini de aramak isteseydim, 3 ayrı dizine ihtiyacım olurdu. Üçüncü bir sütuna eklersem, bu potansiyel olarak 6 dizin olabilir ve bu böyle devam eder.
Dokümanlarda görmediğim bir alternatif, iki sütunu ayrı ayrı dizine eklemek ve ardından normal bir WHERE...OR
sorgu kullanmaktır :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Bu ikisinin ~ 1 milyon satır üzerinde karşılaştırılmasında performansta temel bir fark yok gibi görünüyor.
Benim sorum şu:
Neden sütunları tek tek dizine eklemek yerine bu tür dizinleri birleştirmek istesin ki? Her ikisinin de avantajları ve dezavantajları nelerdir?
En iyi tahminim, önceden önceden bilseydim, sadece her iki sütunu da (her seferinde bir tane) aramak isteyecektim ki, daha az bellek kullanan birleştirerek sadece bir dizine ihtiyacım olacaktı.
title
içine nasıl birleştirmekbody
ve daha sonra bu çok değer verecek endeksleme emin değilim. Muhtemelen onları ayrı ayrı indekslemeye devam ediyorum. Ayrıca, bir şekilde bitirmek için gereken bazı tuhaf bir kerelik olsaydı, o zaman sadece ad-hoc sorgusunu çalıştırabilirsiniz sanırım.