Aby zrozumieć pojęcie wyszukiwania pełnotekstowego, musisz przypomnieć sobie wiedzę o wyszukiwaniu wzorców za pomocą słowa kluczowego LIKE. Załóżmy więc, że w bazie danych „test” znajduje się tabela „osoba” z następującymi rekordami.
>> WYBIERZ * OD osoby;
Załóżmy, że chcesz pobrać rekordy tej tabeli, w której kolumna 'nazwa' ma w dowolnej wartości znak 'i'. Wypróbuj poniższe zapytanie SELECT, używając klauzuli LIKE w powłoce poleceń. Z poniższego wyniku widać, że mamy tylko 5 rekordów dla tego konkretnego znaku' i' w kolumnie 'name'.
>> SELECT * FROM osoba GDZIE nazwa LIKE '%i%';
Korzystanie z Tvsector:
Czasami nie ma sensu używać słowa kluczowego LIKE do szybkiego wyszukiwania wzorców, chociaż to słowo istnieje. Być może rozważysz użycie wyrażeń standardowych i chociaż jest to realna alternatywa, wyrażenia regularne są zarówno silne, jak i powolne. Posiadanie wektora proceduralnego dla całych słów w tekście, opis tych słów w języku narodowym, jest znacznie skuteczniejszym sposobem rozwiązania tego problemu. Koncepcja wyszukiwania pełnotekstowego i typu danych tsvector została stworzona, aby na nią odpowiedzieć. W PostgreSQL są dwie metody, które robią dokładnie to, czego chcemy:
- Do_sektora: Służy do tworzenia listy tokenów (ts oznacza „wyszukiwanie tekstowe”).
- To_tsquery: Służy do wyszukiwania w wektorze występowania określonych terminów lub fraz.
Przykład 01:
Zacznijmy od prostej ilustracji tworzenia wektora. Załóżmy, że chcesz stworzyć wektor dla łańcucha: „Niektórzy ludzie mają kręcone brązowe włosy po odpowiednim szczotkowaniu.”. Musisz więc napisać funkcję to_tvsector() wraz z tym zdaniem w nawiasach zapytania SELECT, jak dołączono poniżej. Z poniższych danych wyjściowych widać, że dałoby to wektor odniesień (pozycje w pliku) dla każdego tokena, a także w przypadku, gdy terminy bez kontekstu, takie jak przedimki (the) i spójniki (i, lub) są celowo ignorowane.
>> SELECT to_tsvector('Niektórzy ludzie mają kręcone brązowe włosy dzięki właściwemu szczotkowaniu');
Przykład 02:
Załóżmy, że masz dwa dokumenty z pewnymi danymi w obu. Do przechowywania tych danych posłużymy się teraz prawdziwym przykładem generowania tokenów. Załóżmy, że utworzyłeś tabelę „Dane” w bazie danych „test” z kilkoma kolumnami za pomocą poniższego zapytania CREATE TABLE. Nie zapomnij utworzyć w niej kolumny typu TVSECTOR o nazwie 'token'. Z poniższych danych wyjściowych możesz spojrzeć na utworzoną tabelę.
>> CREATE TABLE Dane (Id SERIAL PRIMARY KEY, info TEXT, token TSVECTOR);
Teraz okazuje się, że dodamy ogólne dane obu dokumentów w tej tabeli. Więc wypróbuj poniższe polecenie INSERT w powłoce wiersza poleceń, aby to zrobić. Ostatecznie rekordy z obu dokumentów zostały pomyślnie dodane do tabeli „Dane”.
>> INSERT INTO Data (info) VALUES ('Dwa zło nigdy nie naprawią jednego dobrego).'), ('To ten, który może grać w piłkę nożną.'), ('Czy mogę wziąć w tym udział??'), ('Bólu wewnętrznego nie można zrozumieć'), ('Przynieś brzoskwinię do swojego życia);
Teraz musisz skolonizować kolumnę tokenów obu dokumentów z ich określonym wektorem. Ostatecznie proste zapytanie UPDATE wypełni kolumnę tokenów odpowiadającym im wektorem dla każdego pliku. Aby to zrobić, musisz wykonać poniższe zapytanie w powłoce poleceń. Dane wyjściowe pokazują, że aktualizacja została w końcu wykonana.
>> AKTUALIZUJ dane f1 SET token = to_tsvector(f1.info) Z Dane f2;
Teraz, gdy już wszystko mamy na miejscu, wróćmy do naszej ilustracji „puszki” ze skanem. To_tsquery z operatorem AND, jak wspomniano wcześniej, nie ma różnicy między lokalizacjami plików w plikach, jak pokazano na podstawie danych wyjściowych podanych poniżej.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery('może i jeden');
Przykład 04:
Aby znaleźć słowa, które są „obok” siebie, wypróbujemy to samo zapytanie z '<->„operator”. Zmiana jest wyświetlana na poniższym wyjściu.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery('can <-> jeden');
Oto przykład braku bezpośredniego słowa obok drugiego.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery('jeden <-> ból');
Przykład 05:
Znajdziemy słowa, które nie znajdują się bezpośrednio obok siebie, używając liczby w operatorze odległości do odniesienia odległości. Bliskość między „przynieść” a „życie to 4 słowa poza wyświetlanym obrazem”.
>> SELECT * FROM Data WHERE token @@ to_tsquery('przynieś <4> życie');
Aby sprawdzić bliskość między słowami dla prawie 5 słów, dołączono poniżej.
>> SELECT * FROM Data WHERE token @@ to_tsquery('zły <5> dobrze');
Wniosek:
Na koniec wykonałeś wszystkie proste i skomplikowane przykłady wyszukiwania pełnotekstowego przy użyciu operatorów i funkcji To_tvsector i to_tsquery.