For å forstå konseptet med fulltekstsøk, må du huske kunnskap om mønstersøk via LIKE-nøkkelordet. Så la oss anta en tabell 'person' i databasen 'test' med følgende poster i den.
>> VELG * FRA person;
La oss anta at du vil hente postene til denne tabellen, der kolonnen 'navn' har tegnet 'jeg' i noen av verdiene. Prøv SELECT-spørringen nedenfor mens du bruker LIKE-setningen i kommandoskallet. Fra utdataene nedenfor kan du se at vi bare har 5 poster for akkurat dette tegnet 'i' i kolonnen 'navn'.
>> VELG * FRA personen HVOR navnet LIKE '% i%';
Bruk av Tvsector:
Noen ganger nytter det ikke å bruke LIKE Keyword for å gjøre et raskt mønstersøk, selv om ordet er der. Kanskje du vurderer å bruke standarduttrykk, og selv om dette er et gjennomførbart alternativ, er vanlige uttrykk både sterke og svake. Å ha en prosessuell vektor for hele ord i en tekst, en språklig beskrivelse av disse ordene, er en mye mer effektiv måte å løse dette problemet på. Konseptet med komplett tekstsøk og datatypen tsvector ble opprettet for å svare på det. Det er to metoder i PostgreSQL som gjør akkurat det vi vil:
- Til_tvsektor: Brukes til å lage en liste over tokens (ts betyr for "tekstsøk").
- To_tsquery: Brukes til å søke i vektoren etter forekomster av spesifikke termer eller uttrykk.
Eksempel 01:
La oss starte med en enkel illustrasjon av å lage en vektor. Anta at du vil lage en vektor for strengen: “Noen mennesker har krøllete brunt hår gjennom riktig børsting.”. Så du må skrive en to_tvsector () -funksjon sammen med denne setningen i parentesene til et SELECT-spørsmål som vedlagt nedenfor. Fra utdataene nedenfor kan du se at det ville gi en referansevektor (filposisjoner) for hvert token, og også der ord med liten kontekst, som artikler () og konjunktjoner (og, eller), bevisst blir ignorert.
>> VELG to_tsvector ('Noen mennesker har krøllete brune hår gjennom riktig børsting');
Eksempel 02:
Anta at du har to dokumenter med noen data i begge. For å lagre disse dataene, vil vi nå bruke et reelt eksempel på å generere tokens. Anta at du har opprettet en tabell 'Data' i databasen 'test' med noen kolonner i den ved å lage CREATE TABLE-spørringen nedenfor. Ikke glem å lage en TVSECTOR-kolonne med navnet 'token' i den. Fra utdataene nedenfor kan du se på tabellen som er opprettet.
>> CREATE TABLE Data (Id SERIAL PRIMARY KEY, info TEXT, token TSVECTOR);
Nå viser det seg at vi legger til de samlede dataene for begge dokumentene i denne tabellen. Så prøv INSERT-kommandoen nedenfor i kommandolinjeskallet for å gjøre det. Til slutt har postene fra begge dokumentene blitt lagt til i tabellen 'Data'.
>> INSERT INTO Data (info) VERDIER ('To feil kan aldri gjøre en riktig.'), (' Han er den som kan spille fotball.'), (' Kan jeg spille en rolle i dette?'), (' Smerten inni en kan ikke forstås '), (' Bring fersken i livet ditt);
Nå må du kolonisere token-kolonnen til begge dokumentene med deres spesifikke vektor. Til slutt vil et enkelt UPDATE-spørsmål fylle tokens-kolonnen med deres tilsvarende vektor for hver fil. Så du må utføre den angitte spørringen nedenfor i kommandoskallet for å gjøre det. Resultatet viser at oppdateringen endelig er gjort.
>> UPDATE Data f1 SET token = to_tsvector (f1.info) FRA Data f2;
Nå som vi har alt på plass, la oss gå tilbake til illustrasjonen vår av "kan man" med en skanning. To_tsquery with AND operator, som tidligere sagt, gjør ingen forskjell mellom filens plasseringer i filene som vist fra utdataene som er angitt nedenfor.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('can & one');
Eksempel 04:
For å finne ord som er "ved siden av" hverandre, vil vi prøve den samme spørringen med "<->'operatør. Endringen vises i utdataene nedenfor.
>> VELG Id, info FRA Data WHERE token @@ to_tsquery ('kan <-> en');
Her er et eksempel på ingen umiddelbare ord ved siden av en annen.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('one <-> smerte');
Eksempel 05:
Vi finner ordene som ikke er umiddelbart ved siden av hverandre ved å bruke et tall i avstandsoperatøren for å referere til avstand. Nærheten mellom "bring" og "life" er 4 ord bortsett fra det viste bildet.
>> VELG * FRA data WHERE token @@ to_tsquery ('bring <4> liv');
For å sjekke nærheten mellom ordene for nesten 5 ord er lagt ved nedenfor.
>> VELG * FRA data WHERE token @@ to_tsquery ('feil <5> Ikke sant');
Konklusjon:
Til slutt har du gjort alle de enkle og kompliserte eksemplene på fulltekstsøk ved hjelp av To_tvsector og to_tsquery operatorer og funksjoner.