Marcin Paweł S.

Marcin Paweł S. programista
C#/SQL/PHP

Temat: PL/pgSQL

Witajcie, pisze sobie wyszukiwarkę pełnotekstową i do indeksowania tekstu używam funkcji która mi rozbija tekst na słowa z zaznaczeniem na której pozycji w tekście jest dane słowo, udało mi się poskładać z przykładów w necie następującą funkcje ale działa ona straszliwie wolno więc zapytam czy Ktoś ma może pomysł jak to zoptymalizować

wkleję kod:


CREATE OR REPLACE FUNCTION exploduj(tekst text, id character, typ character)
RETURNS SETOF slowarelacje AS
$BODY$declare
tmp text;
i integer;
alf text;
ret slowarelacje%ROWTYPE;
tmp_len integer;
tmp_char character(1);
begin
tmp:='';
i:=1;


alf:='1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMęĘóÓąĄśŚłŁżŻźŹćĆńŃ';



--RAISE NOTICE 'strpos(): %', strpos(alf, ' ');
-- upper()


tmp_len:=length(tekst);
WHILE i<=tmp_len LOOP
-- RAISE NOTICE '%', substr(tekst, i, 1);
tmp_char:=substr(tekst, i, 1);
IF strpos(alf, tmp_char)<>0
THEN
tmp:=tmp||tmp_char;
ELSE --RAISE NOTICE '% ', tmp;
--RAISE NOTICE '% ', i-length(tmp);
if tmp<>'' then
ret.pozycja:=i-length(tmp);
ret.idslowo:=substr(tmp, 1, 40);
ret.typ:=typ;
ret.idobiektu:=id;
RETURN NEXT ret;
tmp:='';
end if;
END IF;
i:=i+1;
END LOOP;

--RAISE NOTICE '% ', tmp;
if tmp<>'' then
ret.pozycja:=i-length(tmp);
ret.idslowo:=substr(tmp, 1, 40);
ret.typ:=typ;
ret.idobiektu:=id;
RETURN NEXT ret;
end if;


-- RAISE NOTICE 'lenght(%)', length(tekst);



return ;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION exploduj(text, character, character) OWNER TO postgres;
Marcin Paweł Stasiak edytował(a) ten post dnia 26.05.11 o godzinie 14:26
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: PL/pgSQL

Marcin Paweł Stasiak:

Marcinie, prośba, używaj znaczników 'code'

tutaj jest kod
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: PL/pgSQL

Łukasz Schabek:
Marcin Paweł Stasiak:

Marcinie, prośba, używaj znaczników 'code'

.. i wcięć w kodzie!
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: PL/pgSQL

Marcin Paweł Stasiak:
Witajcie, pisze sobie wyszukiwarkę pełnotekstową i do indeksowania tekstu używam funkcji która mi rozbija tekst na słowa z zaznaczeniem na której pozycji w tekście jest dane słowo, udało mi się poskładać z przykładów w necie następującą funkcje ale działa ona straszliwie wolno więc zapytam czy Ktoś ma może pomysł jak to zoptymalizować
A próbowałeś już skorzystać z wyrażeń regularnych? (np. regexp_split_to_array)
Marcin Paweł S.

Marcin Paweł S. programista
C#/SQL/PHP

Temat: PL/pgSQL

Znalazłem takie cosik z temacie wyrażań regularnych (jest z 5 razy szybsze)

SELECT foo FROM regexp_split_to_table('the quick brown fox jumped over the lazy dog', E'\\\s+') AS foo;

ale nie zwraca informacji o pozycji słowa, myślałem żeby wynik tego przepuścić przez strpos i zobaczyć czy przypadkiem nie wyjdzie szybciej ale strpos nie sprawdzi się jeśli w tekście jest więcej niż jeden raz dane słowo
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: PL/pgSQL

Zdaje mi się, że problem tkwi głównie w tym, że wykorzystujesz strpos (funkcja zapewne kręci sobie pętle w środku), żeby stwierdzić, czy to znak z alfabetu, czy nie. Znaki tekstowe to też jakieś wartości liczbowe, więc proste pary porównań <= i >= odpowiedzą na pytanie, czy to znak z alfabetu.

Alternatywa to tak jak koledzy wspomnieli funkcje wyrażeń regularnych.Łukasz Kurowski edytował(a) ten post dnia 26.05.11 o godzinie 15:45
Łukasz Dudek

Łukasz Dudek Database
Administrator

Temat: PL/pgSQL

a nie mozesz uzyc tsearch lub sphinx?Łukasz Dudek edytował(a) ten post dnia 27.05.11 o godzinie 19:46
Marcin Paweł S.

Marcin Paweł S. programista
C#/SQL/PHP

Temat: PL/pgSQL

o tsearch nic nie wiem a sphinx bo myślałem nad nie typowym ustalaniem pozycji w wyszukiwarce a grzebanie w kodzie źródłowym sphinksa znacznie przekracza moje skromne umiejętności, sphinks da się "rozbić na kilka serwerów" kiedy jeden już by nie wydalał ??
Łukasz Dudek

Łukasz Dudek Database
Administrator

Temat: PL/pgSQL

tsearch -> wyszukiwanie pełnotekstowe wbudowane (pakiet contrib) w postgresa więc zainteresuj się tym w pierwszej kolejności.

konto usunięte

Temat: PL/pgSQL

Jeżeli chodzi o tsearch to polecam artykuł napisany przez Depesza:
http://www.depesz.com/index.php/2008/04/22/polish-tsea...

Następna dyskusja:

Kontrola wersji funkcji w b...




Wyślij zaproszenie do