2010-02-09 22 views
12

Bu çok basit bir soru olabilir, bu yüzden şimdiden özür dilerim, ama veritabanı kullanımı için çok yeni.Postgres tam metin arama birden fazla ilgili tablolar arasında

Postgres'in tam metin aramasını birden çok birleşik tablolarda çalıştırmasını istiyorum. İlgili Modeller UserProfile ve UserInfo ile bir model Kullanıcı gibi bir şey düşünün. Arama sadece Kullanıcılar için olacak, ancak UserProfile ve UserInfo'dan bilgi içerecektir.

Arama için cin dizini kullanmayı planlıyorum. Bununla birlikte, toplanmış tsvector'ları tabloların arasında tutmak ve güncel tutmak için tetikleyicileri ayarlamak için Kullanıcı tablosunda ayrı bir tsvector sütuna gerekip gerekmediğimi belirsiz değilim. Veya ilgili tabloların herhangi birindeki ilgili alanlardan herhangi biri değiştiğinde kendisini güncel tutacak bir tsvector sütunu olmadan bir dizin oluşturmak mümkün ise. Ayrıca, tüm bunları oluşturmak için komutun sözdizimi ile ilgili ipuçları da çok takdir edilecektir.

cevap

8

En iyi cevabınız muhtemelen her tabloda ayrı bir tsvector sütununa sahip olmalıdır (tabiki bir endeksle). Verileri paylaşılan bir tsvektöre kadar toplarsanız, bu, bireyin güncellediği her seferde çok sayıda güncelleme oluşturacaktır.

Her tablo için bir indekse ihtiyacınız olacak. Ardından, sorguladığınızda, her alan için bir tane birden çok WHERE maddesine gereksiniminiz vardır. PostgreSQL, daha sonra size bitmap taraması kullanmanın mümkün olan en hızlı sonuçlarını vermek için hangi dizin kombinasyonlarının kullanılacağını otomatik olarak hesaplayacaktır. Sorgularınızı yazmak için biraz daha karmaşık hale getirecektir (birden çok sütun eşleme özelliğine gereksiniminiz olduğundan), ancak esnekliği yalnızca istediğiniz durumlarda bazı alanları sorgulamak için tutar.

Birden çok tabloyu izleyen bir dizin oluşturamazsınız. Bunu yapmak için, ayrı bir tsvector sütununa ihtiyacınız vardır ve her bir tabloyu güncellemek için tetikler.

+2

Okuma sorgusunun nasıl çalışacağı hakkında ayrıntılı bilgi alabilir misiniz? Birden çok tablo boyunca postgresql tam metin araması yapmak için en iyi yol üzerinde belgeleri bulmaya çalışıyorum ve fazla bulmadım. Karşılaştığım bir sorun ise, sorguladığım tabloların her birinde bir dizin ayarlarsam, postgresql bir sorgulama yaptığımda tüm dizinleri kullanamayacağıydı. Gibi: kullanıcılardan ayrılan siparişlerden * birini seç ... soldaki line_items'e ... ts_vector ('english', orders.id) @@ ... veya ts_vector ('english', users.name) @@. .. –

+1

Ayrıca iki tablo arama sorgusu sıralı bir tarama yapar ('SELECT COUNT (*) FROM ürünler WHERE to_tsvector ('basit', products.name::text) @@ to_tsquery ('basit', 'foo ':: text];), bir tablo ararken bir sorgu sadece endeksi kullanarak bir bitmap indeks taraması yapar ('SELECT COUNT (*) FROM ürünleri LEFT JOIN markaları ON products.brand_id = brands.id WHERE to_tsvector (' basit ' , products.name::text) @@ to_tsquery ('basit', 'foo' :: metin) OR to_tsvector ('basit', brands.name::text) @@ to_tsquery ('basit', 'foo' :: metin); '). – wvengen