2010-12-27 19 views
14

Czy jest możliwe wykonanie wyszukiwania pełnotekstowego w oparciu o "połowę" słowa? Na przykład próbuję uzyskać dostęp do "tree", ale mówię postgresowi, aby szukał "tr".Wyszukiwanie w pełnym tekście w PostgreSQL część słów

Nie mogę znaleźć takiego rozwiązania, które jest w stanie to zrobić.

Obecnie używam

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

Ale chciałbym zrobić coś takiego:

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

Odpowiedz

10

Wygląda na to, że po prostu chcesz dopasować symbole wieloznaczne.

  • Jedną z opcji, jak wcześniej wspomniano jest trygramy. Moje (bardzo) ograniczone doświadczenie z tym było takie, że był zbyt wolny na dużych stołach jak na mój gust (w niektórych przypadkach wolniej niż LIKE). Jak już wspomniałem, moje doświadczenie z trygramami jest ograniczone, więc mogłem po prostu źle to wykorzystać.

  • Druga opcja można użyć jest moduł wildspeed: http://www.sai.msu.su/~megera/wiki/wildspeed (będziesz musiał zbudować & zainstalować ten tho).

Opcja druga będzie działać również w przypadku dopasowania przyrostowego/średniego. Który może, ale nie musi być większy, niż szukasz.

Istnieje kilka zastrzeżeń (takich jak rozmiar indeksu), więc dokładnie przeczytaj tę stronę.

+4

czy rzeczy z wildspeed nie były częścią rdzenia PostreSQL od 2008 ...? – simon

+0

jakieś odpowiedzi na powyższe pytanie? – Rodrigo

+0

wildspeed nie był aktualizowany od 2008 roku, więc jeśli nie jest już częścią jądra, użyłbym rozszerzenia [pg_trgrm] (http://www.postgresql.org/docs/current/interactive/pgtrgm.html). – RichVel

18

Można użyć prefiksu dopasowania pełnotekstowego, zobacz 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) 

Będzie działać tylko na poszukiwaniu przedrostka chociaż, jeśli nie chcesz częściowego mecz na każdej pozycji w słowie.

+1

To rodzaj kierunku, którego szukam. Ale interesuje mnie słowo (słowa), które są równe "tr: ​​*" (w twoim przykładzie). Czy można odzyskać tylko te słowa? – Grezly

+0

Cóż, aby zbudować na tym, co napisałeś, coś takiego jak SELECT * FROM test GDZIE Wektory @@ to_tsquery ("tr: *") powinny to zrobić. Czy masz na myśli, że chcesz wiedzieć, które pojedyncze słowa w polu tsvector są dopasowane? Nie sądzę, że możesz to zrobić ... –

+0

Potrzebuję rzeczywiście pól/słów pasujących do mojego wejścia. – Grezly

2

wybrać * z testów, to_tsquery ('drzewa') jako Q, gdzie Q lub wektory @@ XXXX jak ('% drzewa%')

': *' jest określenie dopasowanie prefiksu.

Powiązane problemy