Tokenayzers - extensii sqlite fts3 și fts4

5. Tokenizatoare

Tokenizatorul FTS este un set de reguli pentru extragerea termenilor dintr-un document sau o simplă cerere FTS completă.

Dacă creați un tabel în interogarea FTS CREATE TABLE VIRTUAL nu a specificat nici o tokenayzer specifică atunci umolchalnyh tokenayzer va fi utilizat, care este „simplu“. Acest tokenayzer simplu alocă token-uri dintr-un document sau un simplu FTS interogare text complet de următoarele reguli:







Therm - o secvență continuă de caractere valide, care sunt valabile pentru toate simbolurile de litere și cifre, „_“ caracter, precum și toate simbolurile de codare UTF, codul este mai mare sau egal cu 128. Toate celelalte personaje sunt aruncate atunci când sunt clasificate în termenii documentului. Acestea sunt luate în considerare numai ca separatoare ale termenilor din apropiere.

În timpul procesului de tokenizare, toate caracterele majuscule din setul ASCII (cu coduri UTF mai mici de 128) sunt convertite în echivalentele lor minuscule. Ca urmare, atunci când se utilizează tokenizer, interogările simple text întreg devin insensibile la litere mari.

Permiteți, de exemplu, documentul să conțină textul "Acum sunt foarte frustrați". Apoi, din acest document urmează să fie introdus în indicele full-text va fi extras următorii termeni: „chiar acum au fost foarte frustrat“. În cazul în care căutarea documentului care urmează să fie introdus, cum ar fi o cerere de „MECI«Frustrat»“, tokenayzer „simplu“ transformă termenul de interogare litere mici înainte de a căuta indicele full-text.

Împreună cu tokenayzerom „simplu“, codul sursă conține, de asemenea, pe baza FTS tokenayzer algoritm steminga Porter. Acesta tokenayzer folosește aceleași reguli pentru împărțirea documentului în termeni și îi conduce la litere mici, dar altele decât cele pe care le folosește în continuare steminga Porter algoritm pentru a aduce cuvintele limbii engleze la baza. De exemplu, procesarea același document ca și în paragraful precedent, tokenayzer Porter a enumerat următoarele token-uri: „Chiar acum thei verificatorului frustrat“. În timp ce unii dintre acești termeni nu sunt cuvintele limbii engleze, în unele cazuri, utilizarea lor în index full-text face ca rezultatele căutării să fie mai inteligent decât în ​​cazul tokenayzera „simplu“. Când se utilizează tokenayzera „porter“ documentul nostru exemplar poate fi găsit nu doar cere „Potrivirea" Frustrat“, dar, de asemenea, cum ar fi„Potrivirea "Frustrarea“, deoarece atât termenul de „frustrare“, iar termenul „Frustrat“ Algoritmul steminga Porter a aceeași bază de "frustrat". Astfel, atunci când se utilizează tokenayzera „porter“, FTS poate găsi nu numai se potrivește exact termenii solicitate, dar, de asemenea, să se suprapună cu alți termeni în limba engleză similare. Mai multe detalii cu algoritmul de aburi Porter pot fi găsite pe link.







Un exemplu care ilustrează diferența dintre tokenizerele "simple" și "porter":

Dacă extensia este compilată cu opțiunea de preprocesor SQLITE_ENABLE_ICU. apoi există un tokenizer încorporat numit "icu", implementat utilizând biblioteca ICU. Primul argument pentru metoda xCreate () (vezi fts3_tokenizer.h) al acestui tokenizor poate fi identificatorul localizării ICU. De exemplu, "tr_TR" pentru limba turcă folosită în Turcia sau "en_AU" pentru limba engleză folosită în Australia. exemplu:

Implementarea tokenizatorului ICU este foarte simplă. Ea rupe textul introdus în conformitate cu regulile ICU pentru a găsi limitele cuvântului și aruncă toate jetoanele care constau în întregime din spații. Poate fi util pentru unele aplicații cu unele localizări, dar nu pentru toată lumea. Dacă este necesară o prelucrare mai complexă, de exemplu pentru a implementa o ștampilare sau pentru a renunța la punctuație, poate fi necesar să creați un tokenizor care va folosi jetonul ICU ca parte a implementării proprii.

5.1. Custom tokenizers (implementate de utilizatori)

Împreună cu jetoanele încorporate "simple". "porter" și (eventual) "icu" FTS oferă o interfață care permite utilizatorilor să creeze propriile token-uri C. Această interfață, utilizată pentru a crea noi jetoane, este definită și descrisă în fișierul sursă fts3_tokenizer.h.

Înregistrarea unui nou tokenizor FTS este similară înregistrării unui nou modul de tabele virtuale în SQLite. Utilizatorul trimite indicii către o structură care conține indicii pentru diferite funcții de apel invers, care constituie implementarea unui nou tip de tokenizor. Pentru tokenisers această structură este numită "sqlite3_tokenizer_module". Acesta este definit în fișierul fts3_tokenizer.h.

FTS nu analizează funcțiile din C, pe care utilizatorul le solicită pentru a înregistra un nou tokenizor. În schimb, pointerul trebuie să fie criptat ca valoare BLOB și trimis la FTS prin SQL. În acest scop, este furnizată o funcție scalară specială "fts3_tokenizer ()". Această funcție trebuie apelată cu unul sau două argumente, după cum se arată mai jos:

unde Este un șir care identifică tokenizatorul și - pointer la structura în sqlite3_tokenizer_module în BLOB în format SQL. Dacă se specifică acest al doilea argument, acesta va fi înregistrat ca un tokenizor și copia sa va fi returnată. Dacă este specificat un singur argument, atunci ca un indicator al implementării tokenizer-ului actualul va fi acceptat, care va fi returnat în forma codată în BLOB. Sau, dacă un astfel de tokeniser nu există, va exista o eroare SQL (excepție).

Următorul bloc conține un exemplu de a apela funcția fts3_tokenizer () în codul din C:







Trimiteți-le prietenilor: