Aby ste pochopili koncept fulltextového vyhľadávania, musíte si spomenúť na vedomosti o vyhľadávaní vzorov pomocou kľúčového slova LIKE. Predpokladajme teda tabuľku „osoba“ v databáze „test“ s nasledujúcimi záznamami.
>> VYBERTE * OD OSOBY;
Predpokladajme, že chcete načítať záznamy tejto tabuľky, kde stĺpec „name“ má v ktorejkoľvek zo svojich hodnôt znak „i“. Vyskúšajte nasledujúci príkaz SELECT, zatiaľ čo v príkazovom paneli používate klauzulu LIKE. Z výstupu uvedeného nižšie vidíte, že pre tento konkrétny znak „i“ máme v stĺpci „name“ iba 5 záznamov.
>> ZVOLIŤ * OD osoby, KDE JE meno AKO '% i%';
Využitie Tvsector:
Niekedy nie je na použitie rýchleho vyhľadávania ako kľúčové slovo LIKE kľúčové slovo, hoci tam dané slovo je. Možno by ste uvažovali o použití štandardných výrazov, a hoci je to možná alternatíva, regulárne výrazy sú silné a pomalé. Mať procedurálny vektor pre celé slová v texte, ľudový popis týchto slov, je oveľa účinnejším spôsobom riešenia tejto otázky. Na jeho zodpovedanie bol vytvorený koncept kompletného textového vyhľadávania a dátového typu tsvector. V PostgreSQL existujú dve metódy, ktoré robia presne to, čo chceme:
- To_tvsector: Používa sa na vytvorenie zoznamu tokenov (ts znamená pre „textové vyhľadávanie“).
- To_tsquery: Používa sa na hľadanie vektora na výskyt konkrétnych výrazov alebo fráz.
Príklad 01:
Začnime jednoduchou ilustráciou vytvorenia vektora. Predpokladajme, že chcete vytvoriť reťazec: „Niektorí ľudia majú kučeravé hnedé vlasy správnym kefovaním.“. Musíte teda spolu s touto vetou do zátvoriek dotazu SELECT zapísať funkciu to_tvsector (), ako je uvedené nižšie. Z výstupu uvedeného nižšie môžete vidieť, že by priniesol vektor referencií (pozícií súborov) pre každý token a tiež tam, kde sú zámerne ignorované výrazy s malým kontextom, ako sú články (a) a spojky (a, alebo)).
>> SELECT to_tsvector ('Niektorí ľudia majú kučeravé hnedé vlasy po správnom kefovaní');
Príklad 02:
Predpokladajme, že máte dva dokumenty, v ktorých sú niektoré údaje. Na uloženie týchto údajov teraz použijeme skutočný príklad generovania tokenov. Predpokladajme, že ste vytvorili tabuľku „Údaje“ vo svojej databáze „test“ s niektorými stĺpcami pomocou nižšie uvedeného dotazu CREATE TABLE. Nezabudnite v ňom vytvoriť stĺpec typu TVSECTOR s názvom „token“. Z výstupu uvedeného nižšie sa môžete pozrieť na vytvorenú tabuľku.
>> VYTVORIŤ TABUĽKU Údaje (Id SÉRIOVÝ ZÁKLADNÝ KLÍČ, informačný TEXT, token TSVECTOR);
Teraz je na nás, aby sme pridali celkové údaje oboch dokumentov do tejto tabuľky. Skúste to urobiť nasledujúcim príkazom INSERT v prostredí príkazového riadku. Nakoniec boli záznamy z oboch dokumentov úspešne pridané do tabuľky „Údaje“.
>> VLOŽTE DO ÚDAJOV HODNOTY („Dve chyby nemôžu nikdy napraviť jednu.'), („Je to ten, kto môže hrať futbal.'), („Môžem sa na tom podieľať?'), (' Bolesť vo vnútri človeka nemožno pochopiť '), (' Prineste do svojho života broskyňu);
Teraz musíte kolonizovať stĺpec tokenov oboch dokumentov s ich konkrétnym vektorom. Nakoniec jednoduchý dotaz UPDATE vyplní stĺpec tokenov zodpovedajúcim vektorom pre každý súbor. Ak to chcete urobiť, musíte vykonať nižšie uvedený dotaz v príkazovom paneli. Výstup ukazuje, že aktualizácia bola konečne vykonaná.
>> AKTUALIZÁCIA Údaje f1 SET token = to_tsvector (f1.info) FROM Data f2;
Teraz, keď máme všetko pripravené, sa vráťme k našej ilustrácii „môže niekto“ pomocou skenovania. To_tsquery s operátorom AND, ako už bolo povedané, nerobí žiadny rozdiel medzi umiestnením súborov v súboroch, ako je znázornené z výstupu uvedeného nižšie.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('can & one');
Príklad 04:
Aby sme našli slová, ktoré sú „vedľa seba“, skúsime ten istý dotaz pomocou znaku „<->„operátor. Zmena sa zobrazí na výstupe nižšie.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('can <-> jeden ');
Tu je príklad toho, že neexistuje slovo bezprostredne vedľa druhého.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('one <-> bolesť ');
Príklad 05:
Slová, ktoré nie sú bezprostredne vedľa seba, nájdeme pomocou čísla v operátore vzdialenosti na porovnanie vzdialenosti. Blízkosť medzi „priniesť“ a „životom“ je 4 slová od zobrazeného obrázka.
>> SELECT * FROM Data WHERE token @@ to_tsquery ('priniesť <4> život “);
Nižšie je pripojená kontrola blízkosti slov, ktorá obsahuje takmer 5 slov.
>> SELECT * FROM Data WHERE token @@ to_tsquery (nesprávne) <5> správny');
Záver:
Nakoniec ste vykonali všetky jednoduché a komplikované príklady fulltextového vyhľadávania pomocou operátorov a funkcií To_tvsector a to_tsquery.