lunchDaBitch



Metoda list inwersyjnych.


W tej metodzie wyszukiwania, mamy takie oto reguły.
W naszym systemie mamy następujące deskryptory, jest ich dziewięć :

0.(kolor,biala)
1.(kolor,czarna)
2.(kolor,czerwona)
3.(kolor,zielona)
4.(typ,freeride)
5.(typ,freestyle)
6.(typ,wave)
7.(rok,2001)
8.(rok,2002)

Mamy bazę, w której wyszukujemy informacje oraz także kartotekę wyszukiwawczą. W bazie danych znajduje się około 2300 rekordów, którymi są modele desek windsurfingowych. Każdy model ma określony kolor, typ oraz rok produkcji. Założenie jest takie że jeden model może występować z różnymi permutacjami tych deskryptorów.

Kartoteka wyszukiwawcza generowana jest w taki sposób, że dla każdego deskryptora zapisywane są adresy (numery) wszystkich obiektów opisywanych przez ten deskryptor. Czyli jeżeli szukamy np. deski czarnej to kartoteka może wyglądać tak (deski,czarne) = {3,5,10,11,15,20}.

Taka budowa kartoteki powoduje dużą szybkość wyszukiwania, w przypadku, gdy mamy zapytania składające się z pojedynczych deskryptorów. Ale zwiększenie liczby deskryptorów nie powoduje dużej komplikacji obliczeń. W takich wypadkach na zbiorach odpowiedzi z pojedynczych deskryptorów wykonywana jest operacja AND lub OR. Wstawianie do zapytań operatora logicznego NOT nie wiąże się również z większym problemem obliczeniowym. Dodanie lub usunięcie elementu z bazy danych wiąże się z modyfikacją całej kartoteki wyszukiwawczej - należy usunąć adres do tego rekordu z wszystkich powiązanych z nim deskryptorów.

W odróżnieniu od innych metod wyszukiwania, metoda list inwersyjnych przy zapytaniu nie wymaga przeszukiwania całej bazy.
Wadą tej metody może być to, że na przetrzymywanie kartoteki wyszukiwawczej potrzebna jest dodatkowa pamięć. I tak np. w naszym przypadku kartoteka posiada 3 razy więcej elementów niż baza (duża redundancja danych).

Uzasadnienie
Załózmy, że mamy rekord w bazie :
(ID,typ,rok,kolor,model) -> (1,wave,2001,biala,'F2 New Move')
W tym momencie tworząc kartotekę każdy z deskryptorow (typ,wave), (rok,2001), (kolor,biala) będzie przechowywał adres na ten rekord, i tak dla każdego rekordu.

Wniosek
Ilość klas deskryptorów w systemie pomnożona przez ilość danych w bazie danych daje ilość rekordów kartoteki wyszukiwawczej, przy założeniu, że jej struktura w bazie danych wygląda następująco :
(deskryptor,id_rekordu) -> ('typ,wave', 1);
(deskryptor,id_rekordu) -> ('rok,2001', 1);
(deskryptor,id_rekordu) -> ('kolor,biala', 1);

Myśmy w implementacji tej metody zastosowali trochę inne rozwiązanie. Mamy 9 plików korespondujących z 9 deskryptorami systemu. W momencie jak wystąpi zapytanie o dany deskryptor odwołujemy się bezpośrednio do tego pliku, gdzie czeka na nas już gotowa paczka indeksów do rekordów w bazie danych, które po chwili są już wyciągane zapytaniami SQL'owymi.