2010-12-27 29 views
14

Postresql, kelimenin tam anlamıyla 'yarım' olan tam metin araması yapabilir mi? Örneğin, "tree" için arama yapmaya çalışıyorum, ancak postmenlere "tr" aramasını söylüyorum.Postgresql tam metin arama kelimelerin bir parçası

Bunu yapabilen böyle bir çözüm bulamıyorum.

Şu anda

select * from test, to_tsquery('tree') as q where vectors @@ q ; 

kullanıyorum Ama böyle bir şey yapmak istiyorum:

select * from test, to_tsquery('tr%') as q where vectors @@ q ; 

cevap

10

Sadece joker karakter eşlemesi istiyor gibi görünüyor. Daha önce de belirtildiği gibi

  • Seçeneklerden biri, trigram'ların olduğunu. Benim (çok) sınırlı deneyimim benim sevdiğim için masif masalarda çok yavaş olduğuydu (bazı durumlarda LIKE'dan daha yavaş). Dediğim gibi, trigramlarla ilgili deneyimlerim sınırlıdır, bu yüzden yanlış kullanmış olabilirim. Kullanabileceğin

  • İkinci bir seçenek wildspeed modüldür: http://www.sai.msu.su/~megera/wiki/wildspeed (Eğer bu tho yüklemek & inşa etmek gerekir).

İkinci seçenek, sonek/orta eşleme için de çalışır. Aradığından daha fazlası olabilir ya da olmayabilir.

Birkaç uyarı (indeksin büyüklüğü gibi) vardır, bu nedenle bu sayfadan baştan sona okuyun. ': *' Öneki eşleme belirtmektir vektörler @@ qOR XXXX ('% ağacı%')

burada

+4

, wildspeed şeyler 2008'den beri PostreSQL çekirdeğinin bir parçası değil mi? – simon

+0

Yukarıdaki soruya herhangi bir cevap var mı? – Rodrigo

+0

wildspeed 2008'den beri güncellenmemiştir, bu yüzden zaten çekirdeğin bir parçası olmadığı sürece [pg_trgrm] (http://www.postgresql.org/docs/current/interactive/pgtrgm.html) uzantısını kullanacağım. – RichVel

18

Sen, önek eşleşmesini tsearch kullanmak kelimenin herhangi bir konumdaki kısmi eşleşme istemiyor eğer sadece olsa önek arama için çalışacak http://www.postgresql.org/docs/9.0/interactive/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

postgres=# select to_tsvector('tree') @@ to_tsquery('tr:*'); 
?column? 
---------- 
t 
(1 row) 

görebilirsiniz.

+1

Aradığım yön budur. Ama 'tr: *' (örneğinizde) 'e eşit olan sözcük (ler) ile ilgileniyorum. Sadece bu kelimeleri geri almak mümkün mü? – Grezly

+0

Peki, yazdıklarınız üzerine inşa etmek için, SELECT * FROM testi WHERE vektörleri @@ to_tsquery ('tr: *') gibi bir şey yapmalıdır. Yoksa tsvector alanındaki hangi kelimelerin eşleştiğini bilmek mi istiyorsunuz? Bunu yapamayacağımı sanmıyorum ... –

+0

Gerçekten de girdimle eşleşen alanlara/sözcüklere ihtiyacım var. – Grezly

2

q test to_tsquery ('ağaç') seçin *.

İlgili konular