Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PostgreSQL] Problemy z wyszukiwaniem pełnotekstowym
yafu
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.06.2013

Ostrzeżenie: (0%)
-----


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 ?

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Daimos
post
Post #2





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


z tego co tam czytam to jest to kolumna, w której chcesz szukać tekstu (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
yafu
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.06.2013

Ostrzeżenie: (0%)
-----


Przecież 'title' jest kolumną w której chcę szukać tekstu !?
A jeśli nie to czym w takim razie jest 'title' (IMG:style_emoticons/default/questionmark.gif)

?

Ten post edytował yafu 18.07.2013, 09:21:21
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
yafu
post
Post #5





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.06.2013

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
yafu
post
Post #7





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.06.2013

Ostrzeżenie: (0%)
-----


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 ?


?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. ALTER TABLE tabela ALTER COLUMN kolumna type tsvector USING kolumna::tsvector
Go to the top of the page
+Quote Post
yafu
post
Post #9





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 1.06.2013

Ostrzeżenie: (0%)
-----


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 ?


Ten post edytował yafu 31.07.2013, 14:18:50
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 04:04