postgresql select + ilike '%test&'
Acid - 11-07-2007 00:00
postgresql select + ilike '%test&'
witam
mam taką baze danych
CREATE TABLE words ( id bigserial NOT NULL, word text, CONSTRAINT words_pkey PRIMARY KEY (id) )
w polu word, mam okolo 3.5 miliona słów w jezyku polskim ze wszelkimi ich odmianami
szuaknie czegos takieg:
SELECT word FROM words WHERE word like '%test%';
zajmuje bazie na maszynie 1.4ghz + 1gb ramu około 4-5 sekund
wiec "nakladam" index:
CREATE INDEX gist_idx ON words USING gist (word);
i powtarzam zaptanie ;/ efet dokladnie taki sam zapytanie trwa okolo 4-5 sekudn
ma ktos pomysl na optymalizacie tego? lub wytkniecie mi bledu w moim rozumowaniu?
pozdrawiam acid.
Acid - 11-07-2007 00:00
dodam jeszze baza wazy okolo 200MB index 240mb
Lukasz Czarnowski - 11-07-2007 00:00
On Tue, 10 Jul 2007 12:16:59 -0700 Acid <michal@bagrowski.com> wrote:
> witam
hej
> mam taką baze danych > > CREATE TABLE words > ( > id bigserial NOT NULL, > word text, > CONSTRAINT words_pkey PRIMARY KEY (id) > ) > > w polu word, mam okolo 3.5 miliona słów w jezyku polskim ze wszelkimi > ich odmianami > > szuaknie czegos takieg: > > SELECT word FROM words WHERE word like '%test%'; > > zajmuje bazie na maszynie 1.4ghz + 1gb ramu około 4-5 sekund [...] > ma ktos pomysl na optymalizacie tego? lub wytkniecie mi bledu w moim > rozumowaniu?
.... a może zerknij tutaj:
http://www.depesz.com/index.php/2007...-rozszerzanie/
Pozdrawiam -- Lukasz Czarnowski relaks@ciach_o2.pl
Acid - 11-07-2007 00:00
heh :] wlasciwie to post wlasie depesza pociagnal mnie stworzenia tej bazy, chce jej uzyc do wygenerwania bazy polskich testków wlasnie do testow tsercha... wiec raczej ten art mi w niczym nie pomoze
pozdr. acid.
Lukasz Czarnowski - 11-07-2007 00:00
On Tue, 10 Jul 2007 12:32:44 -0700 Acid <michal@bagrowski.com> wrote:
> heh :] wlasciwie to post wlasie depesza pociagnal mnie stworzenia tej > bazy, chce jej uzyc do wygenerwania bazy polskich testków wlasnie do > testow tsercha... wiec raczej ten art mi w niczym nie pomoze
A to trzeba było tak od razu :o) Jaki jest w takim cel użycia ILIKE dla tego słownika? ILIKE %foo% nie skorzysta z indeksu.
Pozdrawiam -- Lukasz Czarnowski relaks@ciach_o2.pl
Acid - 11-07-2007 00:00
sens hm... generalnie zaden... ale chcialbym wiedzec jak costakiego przyszybszyc? bo i tak do generowania bede uzywal losowych rekordów. ktore juz wybieraja mi sie szybciucho tez dzieki pewniemy postowi depesza...
generalnie chce zrobic taka poboczna wyszukiwarke słow, powiedzmy szukam sobie %test% i mam wszystkie poslkie wyrazy z test, których w tej bazzie jest okolo 1400 no ale 5 sekund troche duzo na odpowiedz
wiec jak to zrobic szybsze? ;]
On 10 Lip, 21:59, Lukasz Czarnowski <relaks@ciach_o2.pl> wrote: > On Tue, 10 Jul 2007 12:32:44 -0700 > > Acid <mic...@bagrowski.com> wrote: > > heh :] wlasciwie to post wlasie depesza pociagnal mnie stworzenia tej > > bazy, chce jej uzyc do wygenerwania bazy polskich testków wlasnie do > > testow tsercha... wiec raczej ten art mi w niczym nie pomoze > > A to trzeba było tak od razu :o) Jaki jest w takim cel użycia ILIKE dla > tego słownika? ILIKE %foo% nie skorzysta z indeksu. > > Pozdrawiam > -- > Lukasz Czarnowski > relaks@ciach_o2.pl
Lukasz Czarnowski - 11-07-2007 00:00
On Tue, 10 Jul 2007 13:08:16 -0700 Acid <michal@bagrowski.com> wrote:
> sens hm... generalnie zaden... ale chcialbym wiedzec jak costakiego > przyszybszyc? bo i tak do generowania bede uzywal losowych rekordów. > ktore juz wybieraja mi sie szybciucho tez dzieki pewniemy postowi > depesza... > > generalnie chce zrobic taka poboczna wyszukiwarke słow, powiedzmy > szukam sobie %test% i mam wszystkie poslkie wyrazy z test, których w > tej bazzie jest okolo 1400 no ale 5 sekund troche duzo na odpowiedz > > wiec jak to zrobic szybsze? ;]
Po bandzie: wynająć klaster i wygenerować wynik dla każdego z 3,5mln rekordów ;o) Z tego co widzę przykładowo słownik online na kurniku uwzględnia opcje "zaczynające się od:" i "kończące się na:" dla których przy LIKE można w sprytny sposób użyć indeksu. Może koledzy podpowiedzą jakieś ciekawe rozwiązanie.
Pozdrawiam -- Lukasz Czarnowski relaks@ciach_o2.pl
Acid - 11-07-2007 00:00
On 10 Lip, 22:44, Lukasz Czarnowski <relaks@ciach_o2.pl> wrote: slownok jest wygenerowany na podstawie slownika z kurnika ;] pytanie jak pytac o slowa szybko i sprytnie ;]
> On Tue, 10 Jul 2007 13:08:16 -0700 > > Acid <mic...@bagrowski.com> wrote: > > sens hm... generalnie zaden... ale chcialbym wiedzec jak costakiego > > przyszybszyc? bo i tak do generowania bede uzywal losowych rekordów. > > ktore juz wybieraja mi sie szybciucho tez dzieki pewniemy postowi > > depesza... > > > generalnie chce zrobic taka poboczna wyszukiwarke słow, powiedzmy > > szukam sobie %test% i mam wszystkie poslkie wyrazy z test, których w > > tej bazzie jest okolo 1400 no ale 5 sekund troche duzo na odpowiedz > > > wiec jak to zrobic szybsze? ;] > > Po bandzie: wynająć klaster i wygenerować wynik dla każdego z > 3,5mln rekordów ;o) Z tego co widzę przykładowo słownik online na > kurniku uwzględnia opcje "zaczynające się od:" i "kończące się na:" dla > których przy LIKE można w sprytny sposób użyć indeksu. Może koledzy > podpowiedzą jakieś ciekawe rozwiązanie. > > Pozdrawiam > -- > Lukasz Czarnowski > relaks@ciach_o2.pl
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 12-07-2007 00:09
Acid wrote: > witam > > mam taką baze danych > > CREATE TABLE words > ( > id bigserial NOT NULL, > word text, > CONSTRAINT words_pkey PRIMARY KEY (id) > ) > > w polu word, mam okolo 3.5 miliona słów w jezyku polskim ze wszelkimi > ich odmianami > > szuaknie czegos takieg: > > SELECT word FROM words WHERE word like '%test%'; > > zajmuje bazie na maszynie 1.4ghz + 1gb ramu około 4-5 sekund > > wiec "nakladam" index: > > CREATE INDEX gist_idx > ON words > USING gist > (word); > > > i powtarzam zaptanie ;/ efet dokladnie taki sam zapytanie trwa okolo > 4-5 sekudn > > ma ktos pomysl na optymalizacie tego?
Nie da się.
>lub wytkniecie mi bledu w moim rozumowaniu?
A przedstawiłeś tu jakieś? Nie pisząc skąd Ci takie zapytanie wyszło, nie dałeś nam pola manewru.
-- P.M.
hubert depesz lubaczewski - 12-07-2007 00:09
On 2007-07-10, Acid <michal@bagrowski.com> wrote: > On 10 Lip, 22:44, Lukasz Czarnowski <relaks@ciach_o2.pl> wrote: > slownok jest wygenerowany na podstawie slownika z kurnika ;] pytanie > jak pytac o slowa szybko i sprytnie ;]
like '%cos%' nie będzie indeksowane.
natomiast - jeśli koniecznie chcesz takiego czegoś szukać to masz kilka sposobów.
1. n-gramy (trigramy), one dadzą wyszukiwanie przybliżone i na to nakładasz "like'a" i jest trochę szybciej 2. inna metoda. załóżmy, że masz tabelę: id | slowo zmień ją na: id | prefix | slowo
i wypełniaj tak: 1 | depesz | depesz 1 | epesz | depesz 1 | pesz | depesz 1 | esz | depesz 1 | sz | depesz 1 | z | depesz
oczywiście ilość rekordów będzie olbrzymia. na pole "prefix" zakładasz index zwykły btree, ale z text_pattern_ops
i potem jak chcesz szukać słów %test% to zamiast: select * from tabelka where slowo ilike '%test%' dajesz: select distinct slowo from tabelka where prefix like 'test%';
działa to dzięki temu, że wyszukiwanie like 'cos%' moze byc indeksowane.
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
Acid - 12-07-2007 00:09
On 11 Lip, 09:09, hubert depesz lubaczewski <dep...@depesz.com> wrote: > 1. n-gramy (trigramy), one dadzą wyszukiwanie przybliżone i na to > nakładasz "like'a" i jest trochę szybciej
pogoogluje przetestuje.
> 2. inna metoda. > załóżmy, że masz tabelę: > id | slowo > zmień ją na: > id | prefix | slowo > > i wypełniaj tak: > 1 | depesz | depesz > 1 | epesz | depesz > 1 | pesz | depesz > 1 | esz | depesz > 1 | sz | depesz > 1 | z | depesz > > oczywiście ilość rekordów będzie olbrzymia.
oj na pewno biorac pod uwage ze teraz jest 3.5 mln rekordów, i średnia długość słowa to 12 znaków.... :]
> na pole "prefix" zakładasz index zwykły btree, ale z text_pattern_ops > > i potem jak chcesz szukać słów %test% to zamiast: > select * from tabelka where slowo ilike '%test%' > dajesz: > select distinct slowo from tabelka where prefix like 'test%'; > > działa to dzięki temu, że wyszukiwanie like 'cos%' moze byc indeksowane. > > depesz
napewno sprobuje, jeszcze dzisiaj bede meczyl baze o wygenerowanie czegost akiego
pozdrawiam dzieki za podpowiedz.
On 11 Lip, 03:15, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > Acid wrote: > > > ma ktos pomysl na optymalizacie tego? > > Nie da się.
a jednak sie da
> >lub wytkniecie mi bledu w moim rozumowaniu? > > A przedstawiłeś tu jakieś? > Nie pisząc skąd Ci takie zapytanie wyszło, nie dałeś nam pola manewru.
zapytanie wyszlo z checi przetestowania takowej bazy danych. i jestem "zawiedziony" wynikami, i staram sie uzyskac lepszy wynik na tym polu
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 12-07-2007 00:09
Acid wrote: > > On 11 Lip, 03:15, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: >> Acid wrote: >> >>> ma ktos pomysl na optymalizacie tego? >> Nie da się. > > a jednak sie da
Akurat Ci like przyspieszyli.... Tak naprawdę wszyscy zgadują co chcesz uzyskać.
>>> lub wytkniecie mi bledu w moim rozumowaniu? >> A przedstawiłeś tu jakieś? >> Nie pisząc skąd Ci takie zapytanie wyszło, nie dałeś nam pola manewru. > > zapytanie wyszlo z checi przetestowania takowej bazy danych. i jestem > "zawiedziony" wynikami, i staram sie uzyskac lepszy wynik na tym polu
Ale co chcesz przetestować? Like? Jest wolny. Przetestowałeś. Wniosek - wyszukiwanie dowolnego ciągu znaków w dowolnym tekście, jest wolne i należy przeanalizować problem, czy nie da się zastosować dodatkowych ograniczeń. Żeby nie było, że tylko marudzę. Jeśli 'test' to słowo, to należy wykorzystać to, że w języku polskim jest ograniczona liczba przedrostków, więc robisz zapytanie postaci: like 'test%' or like 'po' || 'test%' or ...
-- P.M.
Acid - 12-07-2007 00:09
On 11 Lip, 14:16, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > Acid wrote: > > > On 11 Lip, 03:15, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > >> Acid wrote: > > >>> ma ktos pomysl na optymalizacie tego? > >> Nie da się. > > > a jednak sie da > > Akurat Ci like przyspieszyli.... > Tak naprawdę wszyscy zgadują co chcesz uzyskać. > > >>> lub wytkniecie mi bledu w moim rozumowaniu? > >> A przedstawiłeś tu jakieś? > >> Nie pisząc skąd Ci takie zapytanie wyszło, nie dałeś nam pola manewru. > > > zapytanie wyszlo z checi przetestowania takowej bazy danych. i jestem > > "zawiedziony" wynikami, i staram sie uzyskac lepszy wynik na tym polu > > Ale co chcesz przetestować? Like? Jest wolny. Przetestowałeś. > Wniosek - wyszukiwanie dowolnego ciągu znaków w dowolnym tekście, jest wolne > i należy przeanalizować problem, czy nie da się zastosować dodatkowych ograniczeń. > Żeby nie było, że tylko marudzę. > Jeśli 'test' to słowo, to należy wykorzystać to, że w języku polskim jest ograniczona > liczba przedrostków, więc robisz zapytanie postaci: > like 'test%' or like 'po' || 'test%' or ... > > -- > P.M.
no to ze jest wolny to zauwazylem, staram sie uzyskac takie same wyniki jak % % szybciej
http://phpfi.com/248956
powyzej 3 zapytania do bazy o "rower" "mama" "babcia" z wynikami, kazde okolo 5 sekund, %test% byl tylko przykladem (sam test zwraca okolo 1400 wyników :])
po prostu chodiz mi o zrobienie szybkiej wyszukiwarki słów, w raz z ich "odmianami" czyli po prostu chce wyciagnac wszystko co zawiera dane słowo
pozd.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 12-07-2007 00:09
Acid wrote: > On 11 Lip, 14:16, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: >> Acid wrote: > > no to ze jest wolny to zauwazylem, staram sie uzyskac takie same > wyniki jak % % szybciej > > http://phpfi.com/248956 > > powyzej 3 zapytania do bazy o "rower" "mama" "babcia" z wynikami, > kazde okolo 5 sekund, %test% byl tylko przykladem (sam test zwraca > okolo 1400 wyników :]) > > po prostu chodiz mi o zrobienie szybkiej wyszukiwarki słów, w raz z > ich "odmianami" czyli po prostu chce wyciagnac wszystko co zawiera > dane słowo
Tylko że do szukania odmian like się nie nadaje (np. rząd, rzędzie - a są i bardziej skomplikowane przypadki). Żeby poprawnie, a jednocześnie szybko, wybrać wszystkie odmiany szukanego wyrazu musisz sobie stworzyć tabele (słowo,rdzeń). Wtedy wyszukujesz słowo (bez likie więc z użyciem indexu) i znajdujesz jego rdzeń. Potem wyszukujesz rdzeń (bez like a więc z użyciem indexu) i otrzymujesz wszystkie odmiany danego wyrazu. Szybko i poprawnie!
-- P.M.
Acid - 12-07-2007 00:09
On 11 Lip, 15:57, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > Acid wrote: > > On 11 Lip, 14:16, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > >> Acid wrote: > > > no to ze jest wolny to zauwazylem, staram sie uzyskac takie same > > wyniki jak % % szybciej > > >http://phpfi.com/248956 > > > powyzej 3 zapytania do bazy o "rower" "mama" "babcia" z wynikami, > > kazde okolo 5 sekund, %test% byl tylko przykladem (sam test zwraca > > okolo 1400 wyników :]) > > > po prostu chodiz mi o zrobienie szybkiej wyszukiwarki słów, w raz z > > ich "odmianami" czyli po prostu chce wyciagnac wszystko co zawiera > > dane słowo > > Tylko że do szukania odmian like się nie nadaje (np. rząd, rzędzie - a są > i bardziej skomplikowane przypadki). > Żeby poprawnie, a jednocześnie szybko, wybrać wszystkie odmiany szukanego > wyrazu musisz sobie stworzyć tabele (słowo,rdzeń). Wtedy wyszukujesz słowo > (bez likie więc z użyciem indexu) i znajdujesz jego rdzeń. Potem wyszukujesz > rdzeń (bez like a więc z użyciem indexu) i otrzymujesz wszystkie odmiany > danego wyrazu. Szybko i poprawnie! > > -- > P.M.
napisałem "odmianami"... chodzi mi wlasnie doklandie o takie wyniki jak zwraca %like% no nic wlasnie buduje baze w/g tego co podał depesz zobaczymy co z tego wyjdzie :]
a.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 12-07-2007 00:09
Acid wrote: > On 11 Lip, 15:57, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > > napisałem "odmianami"... chodzi mi wlasnie doklandie o takie wyniki > jak zwraca %like% no nic wlasnie buduje baze w/g tego co podał depesz > zobaczymy co z tego wyjdzie :]
A, jeśli tak, to ok. A przyda Ci sie to do czegoś innego oprócz testów? ;)
-- P.M.
Acid - 12-07-2007 00:09
On 11 Lip, 18:29, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > Acid wrote: > > On 11 Lip, 15:57, Paweł Matejski <m...@spam.madej.pl.eu.org> wrote: > > > napisałem "odmianami"... chodzi mi wlasnie doklandie o takie wyniki > > jak zwraca %like% no nic wlasnie buduje baze w/g tego co podał depesz > > zobaczymy co z tego wyjdzie :] > > A, jeśli tak, to ok. A przyda Ci sie to do czegoś innego oprócz testów? ;) > > -- > P.M.
szczeze? nie :]
ale chce poznac "mozliwosci" bazy ;] jak narazie "przerobiłem" 470k słow, mam 3.5 mln w tabeli wynikowej :] baza 220mb index 117 mb ;] ciekawe na czym sie skonczy :]
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.pltejsza.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|