Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PostgreSQL] Problemy z wyszukiwaniem pełnotekstowym
Forum PHP.pl > Forum > Przedszkole
yafu
Witam,

Próbuję przejść na wyszukiwanie pełnotekstowe, jednak już na samym początku pojawiły się problemy.

Korzystając z:
http://www.postgresql.org/docs/8.3/static/...rch-tables.html

chciałem wykonać najprostsze wyszukiwanie bez indeksów, czyli jak z przykładu:
  1. SELECT title
  2. FROM pgweb
  3. WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend');


Czyli pobieram kolumnę title z tabeli pgweb, gdzie znajdzie się słowo 'friend'.
Przerobiłem to pod swoje dane, ale mam błąd związany z 'body' - myślałem, że po prostu tu ma zawsze być body, ale okazuje się że nie.

Czym więc jest to body (jakieś pole?) i jak zrobić, żeby to działało ?

Daimos
z tego co tam czytam to jest to kolumna, w której chcesz szukać tekstu wink.gif
yafu
Przecież 'title' jest kolumną w której chcę szukać tekstu !?
A jeśli nie to czym w takim razie jest 'title' questionmark.gif

?
phpion
W Twoim przykładzie: title jest kolumną, którą zwracasz w wyniku zapytania, a wyszukujesz po kolumnie body. Kolumna body musi być typu tsvector. Czyli chcąc zrobić wyszukiwanie po title musisz dodać nową kolumnę np. title_tsv i jej użyć w wyszukiwaniu. Wartość tej kolumny najlepiej aktualizować triggerem w momencie zmiany wartości kolumny title.
yafu
Dzięki za info, teraz już rozumiem o co chodzi.
Mam jednak jeszcze pytanie, bo napisałeś, że kolumna musi być typu tsvector - ja przed chwilą wyszukiwałem w ten sposób po kolumnie typu
character varying:

  1. SELECT item
  2. FROM end
  3. WHERE to_tsvector('english', it_name) @@ to_tsquery('english', 'spodnie');


I działa, zwraca odpowiednie rekordy, co prawda długo to trwa (baza kilka Gb a docelowo ma mieć kilkaset, więc już się boję), fakt nie ma pozakładanych indeksów...

Tak czy inaczej działa to na kolumnie bez tsvector, a napisałeś że kolumna musi być tsvector ?
Czy to przyśpieszy wykonywanie zapytań jeśli ją konwertuje do tsvector ?
(nie mogę robić oddzielnej kolumny triggerem tak jak zasugerowałeś, gdyż baza i tak będzie ogromna i muszę ją jak najbardziej odchudzać, więc taka nadmiarowość odpada).
phpion
Działa wolno z racji tego:
to_tsvector('english', it_name)
Dla każdego wiersza przekształcasz dane na tsvector. Dodając osobną kolumnę typu tsvector możesz skorzystać z:
kolumna @@ to_tsquery...
Czyli wyszukujesz już na gotowych danych typu tsvector. Dodatkowo na tej kolumnie załóż indeks gist i powinno być zdecydowanie lepiej.
yafu
Rozumiem, a czy możesz mi jeszcze pomóc i podpowiedzieć jak przekształcić kolumnę character_varying do tsvector ?
Próbując to zrobić bezpośrednio z pgadmina dostaję info:

ERROR: column "it_name" cannot be cast to type tsvector, jednak chyba jakoś się da ?


?
mmmmmmm
  1. ALTER TABLE tabela ALTER COLUMN kolumna type tsvector USING kolumna::tsvector
yafu
Teoretycznie poszlo, ale wiedziałem, że będzie błąd z nietypowymi znakami bo pojawia się:

ERROR: syntax error in tsvector: "*kaczka*"

Czyli przy '*' nie przechodzi już...
Można to jakoś obejść ?
Jeśli nie to w takim razie jak zapisywać do kolumy typu ts_vector takie 'nietypowe' znaki ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.