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:
Marcin Paweł Stasiak edytował(a) ten post dnia 26.05.11 o godzinie 14:26
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;