For at forstå begrebet fuldtekstsøgning skal du huske viden om mønstersøgning via LIKE-nøgleordet. Så lad os antage en tabel 'person' i databasens 'test' med følgende poster i den.
>> VÆLG * FRA person;
Lad os antage, at du vil hente posterne i denne tabel, hvor kolonnen 'navn' har tegnet 'i' i nogen af dens værdier. Prøv nedenstående SELECT-forespørgsel, mens du bruger LIKE-klausulen i kommandoskallen. Fra nedenstående output kan du se, at vi kun har 5 poster for denne særlige karakter 'i' i kolonnen 'navn'.
>> VÆLG * FRA personen HVOR navn LIKE '% i%';
Brug af Tvsector:
Nogle gange nytter det ikke at bruge LIKE Keyword til at foretage en hurtig mønstersøgning, selvom ordet er der. Måske overvejer du at bruge standardudtryk, og selvom dette er et muligt alternativ, er regulære udtryk både stærke og træg. At have en proceduremæssig vektor for hele ord i en tekst, en beskrivelse af disse ord på folkemunne, er en meget mere effektiv måde at løse dette problem på. Konceptet med komplet tekstsøgning og datatypen tsvector blev oprettet for at svare på det. Der er to metoder i PostgreSQL, der gør lige hvad vi vil:
- Til_tvsektor: Bruges til at oprette en liste over tokens (ts betyder "tekstsøgning").
- To_tsquery: Bruges til at søge i vektoren efter forekomster af bestemte termer eller sætninger.
Eksempel 01:
Lad os starte med en simpel illustration af oprettelse af en vektor. Antag at du vil lave en vektor til strengen: ”Nogle mennesker har krøllet brunt hår gennem korrekt børstning.”. Så du er nødt til at skrive en to_tvsector () funktion sammen med denne sætning i parenteserne af en SELECT-forespørgsel som vedlagt nedenfor. Fra nedenstående output kan du se, at det ville give en vektor af referencer (filpositioner) for hvert token, og også hvor udtryk med lille kontekst, som artikler () og konjunktioner (og, eller), bevidst ignoreres.
>> VÆLG til_tsvector ('Nogle mennesker har krøllede brune hår gennem korrekt børstning');
Eksempel 02:
Antag, at du har to dokumenter med nogle data i dem begge. For at gemme disse data bruger vi nu et reelt eksempel på at generere tokens. Antag at du har oprettet en tabel 'Data' i din database 'test' med nogle kolonner i den ved hjælp af nedenstående CREATE TABLE-forespørgsel. Glem ikke at oprette en TVSECTOR-type kolonne med navnet 'token' i den. Fra nedenstående output kan du se på den tabel, der er oprettet.
>> CREATE TABLE Data (Id SERIAL PRIMARY KEY, info TEXT, token TSVECTOR);
Nu viser det os, at vi tilføjer de samlede data for begge dokumenter i denne tabel. Så prøv nedenstående INSERT-kommando i din kommandolinjeskal for at gøre det. Endelig er posterne fra begge dokumenter tilføjet med succes i tabellen 'Data'.
>> INSERT INTO Data (info) VÆRDIER ('To forkerte ting kan aldrig gøre en ret.'), (' Han er den, der kan spille fodbold.'), (' Kan jeg spille en rolle i dette?'), (' Smerten inde i en kan ikke forstås '), (' Bring fersken i dit liv);
Nu skal du kolonisere token-søjlen i begge dokumenter med deres specifikke vektor. I sidste ende udfylder en simpel UPDATE-forespørgsel tokens-kolonnen med deres tilsvarende vektor for hver fil. Så du skal udføre nedenstående forespørgsel i kommandoskallen for at gøre det. Outputtet viser, at opdateringen endelig er foretaget.
>> UPDATE Data f1 SET token = to_tsvector (f1.info) FRA Data f2;
Nu hvor vi har det hele på plads, lad os vende tilbage til vores illustration af "kan man" med en scanning. At to_tsquery med AND-operatøren, som tidligere nævnt, gør ingen forskel mellem filernes placering i filerne som vist fra output angivet nedenfor.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('can & one');
Eksempel 04:
For at finde ord, der er "ved siden af" hinanden, vil vi prøve den samme forespørgsel med '<->'operatør. Ændringen vises i nedenstående output.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('kan <-> en');
Her er et eksempel på intet øjeblikkeligt ord ved siden af et andet.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('one <-> smerte');
Eksempel 05:
Vi finder de ord, der ikke er umiddelbart ved siden af hinanden ved at bruge et tal i afstandsoperatøren til at referere til afstand. Nærheden mellem 'bringe' og 'liv er 4 ord bortset fra det viste billede.
>> VÆLG * FRA data HVOR token @@ til_tsquery ('bring <4> liv');
For at kontrollere nærhed mellem ordene for næsten 5 ord er der vedhæftet nedenfor.
>> VÆLG * FRA data WHERE token @@ til_tsquery ('forkert <5> ret');
Konklusion:
Endelig har du gjort alle de enkle og komplicerede eksempler på fuldtekstsøgning ved hjælp af To_tvsector og to_tsquery-operatorer og -funktioner.