1

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.

cevap

1

Genellikle aradığınız ifade belirlemek üzere ve 'simple' sözlükle kaynaklanan olmadan ts_rank() işlevini kullanabilirsiniz tam metin dili sözlüğü esas kullanılan, tam metin araması ile öylesine gövdeleme kelime gerektirir, konuşma .

WITH t(v) AS (VALUES 
    ('Test sentence with Pope Francis'), 
    ('Test Francis sentence with Pope '), 
    ('The pope is named Francis') 
) 
SELECT v,ts_rank(tsv,q) as rank 
FROM t, 
    to_tsvector('simple',v) as tsv, 
    plainto_tsquery('simple','Pope Francis') AS q; 

Sonuç:

tam metin arama olmadan
   v     | rank  
----------------------------------+----------- 
Test sentence with Pope Francis | 0.0991032 
Test Francis sentence with Pope | 0.0973585 
The pope is named Francis  | 0.0973585 
(3 rows) 

, daha hızlı sadece uygulayabilirsiniz ILIKE desen pg_trgm uzantılı eşleşen. Örnek here.

+0

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

+0

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

+0

Tamam, teşekkürler! – jayp

İlgili konular