Yaklaşık 1,5 milyon kayıt içeren bir Postgres veritabanım var. Ruby on Rails uygulamasında, statement_text
alanını (1 ila yüzlerce kelime arasında bir yeri içerebilen) aramalıyım.Postgres tam metin aramasını kullanarak tam bir eşleşme araması yapmanın en iyi yolu nedir?
Benim sorun: Ben search_all_words
veya search_any_words
gibi kapsamları oluşturmak için pgSearch
mücevher kullanabilirsiniz biliyorum ama sonuç kümesinde döndürülen tam eşlemesi sadece kayıtları sağlamak için en etkili yolu nedir belirsiz değilim . Yani, "Papa Francis" i ararsam, yalnızca ardışık ve aynı sırayla ("Papa" Francis "olarak adlandırılır) aksine sadece iki kelimeyi bulmasını istiyorum.
Şimdiye kadar, tam eşleşme aramaları için bir GIN indeksini ILIKE
ile birleştirdim. Ancak, bir GIN endeksi esasen her kayıtta storing the exact position of a word ile çalıştığı için, arama teriminin alanla tam olarak eşleşmesi için daha verimli (ILIKE
) olmamalıdır.
Teşekkürler, Dmitry! Tam metin arama kullanıyorum, böylece ts_rank kullanabilirim. Sorun şu ki - alanın kelime sayımına bağlı olarak - kelimelerin ILIKE kullanmadan bitişik ve doğru sırada olmasını sağlayacak özel bir cutoff yoktur. Bunu doğru anlıyor muyum? – jayp
no, uzunluğa göre kesik yoktur. İfade için bir eşleşme varsa, hala daha yüksek sıralamaya sahip olacaktır. ts_rank için normalizasyon faktörünü atlayabilirsiniz - iyi çalışması gerekir. –
Tamam, teşekkürler! – jayp