konto usunięte

Temat: Przeszukiwanie złączonych tokenów

Witam,

Jestem w trakcie tworzenia większej aplikacji w której klient zażyczył aby pewne dane były wyszukiwane według jego algorytmu. (struktura bazy z góry określona przez klienta).

Wygląda to tak, że mam w tabeli pole (np. nazwy) które przechowuje informacje według formy

Nazwa długa+Nazwa2+nazwa3


Ja muszę znaleźć 2 rekordy które mają te same wartości w polu "nazwy" lecz niekoniecznie w tej samej kolejności, przy czym nazwy rozdzielane są znakiem +, próbowałem grzebać coś z vektoryzacją(to_tsvector) tych danych i zapisywaniu ich w dodatkowych polach, jednak jakoś mi nie idzie.

Może macie jakiś pomysł, by rozwiązać to stricte poprzez mechanizmy postgresa. Opiszcie jak to zrobić, ew. wskażcie linki gdzie mogę się tego nauczyć.
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: Przeszukiwanie złączonych tokenów

W sumie nie napisałes jakiego postgresa używasz ale tak na szybko jeśli chcesz używać tylko sql (bez plpgsql) można zaproponować coś takiego
przy założeniu że tabela nazywa się test a kolumna nazwy.

select array_to_string(
array(
select((select string_to_array(nazwy,'+') from test limit 1
offset j)::anyarray)[i]
from generate_series(1,3) i order by 1
),
'+'
) k,
count(*) from generate_series(0,6) j group by k;

Jako druga wartość w generate_series(0,6) powinieneś podać ilość wierszy w tabeli (u mnie ilość wierszy=6).
Ale chyba zamiast takiego potworka lepiej napisać jakąś funkcję w plpgsql, która sortowałaby elementy tablicy czyli robiła coś takiego

array_to_string(
array(
select((select string_to_array(nazwy,'+') from test limit 1
offset j)::anyarray)[i]
from generate_series(1,3) i order by 1
),
'+'
)

konto usunięte

Temat: Przeszukiwanie złączonych tokenów

Używam wersji 8.3/8.4 może być plpgsql
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: Przeszukiwanie złączonych tokenów

No to prościej zrobić funkcję

--pierwszy argument to string do posortowania, drugi separator pól
create or replace function sort_string(text,text) returns text as
$$
declare
--ilosc separatorow
delim_number integer;
--posortowany string
string text;
begin
--liczymy ilosc separatorow
execute 'select length(regexp_replace('||quote_literal($1)||',''[^'||$2||']'','''',''g''))' into delim_number;

--sortujemy string
select array_to_string(array(select((select string_to_array($1,$2)::anyarray)[i] from generate_series(1,delim_number+1) i order by 1),$2) into string;
return string;
end;
$$
language plpgsql;

i wywolac na pryzklad tak

select sort_string(nazwy,'+'),count(*) from test group by sort_string(nazwy,'+');

no mam nadzieje że się nie machnąłem nigdzie bo mi z virtualboxa nie chce kopiować :).

Następna dyskusja:

przeszukiwanie kolumny i uz...




Wyślij zaproszenie do