2009-09-28 20 views
12

en aşağıdaki gibi bir postgres 8.3 tablo var diyelim:Tam metin dizininden yararlanan öbeklere tam metin arama yöntemiyle nasıl yapılır?

CREATE TABLE t1 (body text, body_vector tsvector);

ben tam metin dizini (GiST, cin veya tsvector sütun üzerinde ikisi) kullanarak ifadeler için arama yapabilmek istiyorum. Bulabildiğim en iyi çözüm, önce her iki kelimede (boolean AND) tam metin aramayı yapmak ve daha sonra ifade için vücutta benzer bir karşılaştırma yapmaktır. Tabii ki bu, postgres'in tam metin aramasının sizin için yaptığı herhangi bir saptırmayı veya yazım denetimini yakalayamaz. Ben ifade 'w1 w2' araması ediyorsam Bunun bir örneği, ben kullanırım:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

Eğer arama başvurmak zorunda değilsiniz nerede bunu yapmanın bir yolu var mı metin sütunu

cevap

11

Tam deyim eşleşmesini istiyorsanız, bunu yapmanın yolu budur. Ayrıca WHERE body_vector @@ plainto_tsquery ('w1 w2') 'yi deneyebilir ve sıralamaya göre sıralayabilirsiniz.

4

Güncelleme (nokta kelimeler yan yana doğru olan hit üst üzerinde son gerektiğini olmak üzere):

: PostgreSQL 9.6 metin arama ifadeler
select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

veya sözcükler arasında mesafeye göre destekler
-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

Belki bir şey yakalamadım, ancak bu giriş dizesi tek tırnak arasında aranan deyimi içermesi gerekmez mi? Genel olarak, bu ifade genel olarak auser girdiden geldiğinde ve belge bir veritabanı sütundan geldiğinde nasıl kullanabilir? –

+1

Bu hala "cümle aranıyor" değil. Bu sadece tsvector 'new york' ifadesinin tek tırnak içine sarıldığından çalışmaktadır. – soyayix

+0

Evet, her iki işlevi de yapar - ama tsvector dizginiz çoğu durumda tek tırnaklara sahip olmaz - eğer öyleyse arama ifadesi nedir? .. Bir postgreSQL 9.4 ve çalıştığınız sorgu var - bu sadece 9.6'ya özgü seç 'i new york şehrini seviyorum' :: tsvector @@ 'new' :: tsquery, --true 'i new york city' :: tsvector @@ 'new & york' :: tsquery, - true 'new york şehrini seviyorum' :: tsvector @@ '' 'new york' '' :: tsquery --false – soyayix

İlgili konular