full text search | speech by matteo durighetto | pgday.it 2013

59
Full Text Search Matteo Durighetto Italian PostgreSQL Users Group www.itpug.org www.postgresql.org PGDay.IT 2013 Monash University Prato Centre Venerdì 25 Ottobre 2013 Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Upload: miriade-spa

Post on 14-Dec-2014

318 views

Category:

Documents


1 download

DESCRIPTION

Slide dell'intervento di Matteo Durighetto al PGDay.IT 2013, Prato, 25 Ottobre 2013 Il Full Text Search nasce dall’esigenza di ricercare parole o loro derivati all’interno di un documento. Infatti non sempre il problema è risolubile con le espressioni regolari, basti pensare ai plurali irregolari (per cui il problema del matching necessità di un dizionario) o al problema di calcolare la similarità di una parola (ad esempio per cercare l’argomento più attinente e farne una classifica). In questo talk andremo ad esplorare le peculirità di PostgreSQL e le sue potenzialità al riguardo.

TRANSCRIPT

Page 1: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Full Text Search Matteo Durighetto

Italian PostgreSQL Users Group www.itpug.org

www.postgresql.org

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Page 2: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

● Speaker/Author:○ Matteo Durighetto○ DBA @ Miriade S.p.A.○ tecnologie db: Oracle, PostgreSQL, MySQL, MSSQL ○ tecnologie os/virtual/cloud: AWS, Vmware,XEN, Linux, *NIX,

Windows○ Membro e Vice Presidente ITPUG

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

WHOAMI;

Page 3: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

INDEX

● Full Text Search: a cosa serve● Perchè non il b-tree ?● Dizionario, Token, Lemma● Configurazione FTS ● Full Text Search Acceleration: Index● Full Text Search Query● Trigram

Page 4: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Il full text search nasce dall’esigenza della ricerca documentale:

Trovare tutti i testi che contengono una determinata parola e le sue flessioni.

Se un testo contiene “casa” o “case” sarà equivalente.

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Full Text Search : a cosa serve?

Page 5: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Esempi nell’uso reale di tutti i giorni di Full Text Search :

● DuckDuckGo, Google, Yahoo, Bing...● Ricerca dei testi che contengono una certa parola in un

Documentale ( Alfresco, Documentum, SharePoint..)● Ricerca di una mail● etc..

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Full Text Search : a cosa serve?

Page 6: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Perchè:● Indicizzare con un b-tree un campo è ottimo per la ricerca tramite

predicati dove si compara un “documento” con il suo valore, non per la ricerca all’interno di un documento di un possibile valore in una delle sue declinazioni.

● Cercare documento like ‘%testo%’ comporterà un full scan!

● l’altezza del b-tree nel caso peggiore va come :log (d , (n+1)/2 , dove d è il minimo numero di keys per blocco e n è il numero di chiavi indicizzate. Se quindi le nostre chiavi sono tutti i lemmi indicizzati o solo quelli necessari le cose cambiano di molto!

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Perchè non un indice normale ?

Page 7: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Lemma : è la forma canonica di una parola [priva di suffissi].

Token: una parola di senso compiuto non necessariamente in forma canonica, in genere separata da spazi, va fatta attenzione alle lingue agglutinate come il filandese e il tedesco in cui una parola può essere composta da più morfemi !

Dizionario: un programma che data una parola, restituisce se possibile uno o più lemmi.

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Documento Token Lemmapre-processing conversione

eliminazione stop word

Page 8: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Documento

Parser

Configurazione FTS

Token SI Stop word ? tsvectorNO

NOSI

lunghezza>2047Byte

N.B. tsvector < 1Mb

Loop per ogni parola

DIZIONARIO

Page 9: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Esempio :

A. “ Questa sera andiamo a teatro “ == DOCUMENTO

B. “questa” “sera” “andiamo” “a” “teatro” == TOKEN

C. “a” “questa” == STOP WORD [ eliminata in automatico ]

D. “ser” “andiam” “teatr” == LEMMI

E. “andiam” “ser” “teatr” == LEMMI ORDINATI

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Page 10: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token LemmaCome fa il matching Postgres tra Documento e la nostra ricerca?

Introduce tre concetti:● tsvector : un insieme ben ordinato di lemmi● tsquery : un insieme di lemmi in formato query con operatori

booleani ( | & ! )● un operatore FTS : @@

La rappresentazione segue la forma Bakus Naus:

<tsvector> = <lemma>[:<posizione>]<spazio><tsquery> = <lemma><spazio>[booleano]

La posizione è opzionale e può essere usata per calcolare il rank in base alla prossimità [ max 2^14-1 ]

Page 11: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Esempio di con i type tsvector & tsquery senza trasformazione in lemmi dei token ma usando il casting:

select 'sto andando a casa, questa sera torno tardi'::tsvector; ---------------------------------------------------------------------------- 'andando' 'casa,' 'questa' 'sera' 'sto' 'tardi' 'torno'

select 'tardi & casa'::tsquery ;------------------- 'tardi' & 'casa'

select 'sto andando a casa, questa sera torno tardi'::tsvector@@'tardi & casa'::tsquery ;

true

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

stop word

Page 12: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Esempio con le funzioni to_tsvector e to_tsquery sfruttando il dizionario :

select to_tsvector('italian','sto andando a casa, questa sera torno a casa tardi'); ------------------------------------------------- 'andand':2 'cas':4,9 'ser':6 'tard':10 'torn':7

select to_tsquery('italian','tardi & casa'); ----------------- 'tard' & 'cas'

select to_tsvector('italian','sto andando a casa questa sera torno a casa tardi')@@to_tsquery('italian','tardi & casa');

TRUE

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Page 13: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Operatori tra lemmi all’interno di una ts_query:

& = AND ‘cat & dog’::ts_query == 'cat' & 'dog'

cerco tutti i documenti che contengono la parola cat e dog

| = OR ‘cat | dog’::ts_query == 'cat' | 'dog'

cerco tutti i documenti che contengono la parola cat o dog

! = NOT ‘cat & !dog’::ts_query == 'cat' & !'dog'

cerco tutti i documenti che contengono la parola cat MA non dog

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Page 14: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

TIPS: Per verificare come vengono trasformati i token in lemmi possiamo usare una funzione di debug :

select ts_leximize(‘italian_stem’,‘testo’);------------------------------test

TIPS: In genere non viene usato un vero e proprio dizionario, ma un algoritmo chiamato Snowball e un elenco di stop word che trovate nella directory /usr/share/postgresql/*/tsearch_data. In genere viene suddiviso in tag a seconda delle tipologia di lemmi da indicizzare

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Page 15: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario

Il dizionario è la parte principale con la configurazione FTS sia delle performance sia della esattezza delle ricerche.

Un dizionario è un programma che data una parola restituisce se possibile uno o più lemmi.

Vi sono 4 tipologie di dizionario che andremo ad esplorare.

Page 16: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Simple

Converte le parole in minuscolo, le confronta con un elenco di stop word [ deve essere creato un dizionario per questo ]. Esempio:

CREATE TEXT SEARCH DICTIONARY public.dict_italiano_semp ( TEMPLATE = pg_catalog.simple, STOPWORDS = italian);

testfulltext=# select ts_lexize('dict_italiano_semp','questa'); ts_lexize----------- {}

Page 17: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Simple

select ts_lexize('dict_italiano_semp','radar'); ts_lexize----------- {radar}

TIPS: Il dizionario semplice è molto buono, se nel documento italiano vi sono termini stranieri che lo stemmer dictionary probabilmente convertirebbe in lemmi errati, si paga tuttavia una maggior dimensione del tsvector!

Page 18: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Stem o Stemmer

Di default i dizionari usati da PostgreSQL sono stemmer. Ovvero usano un algoritmo a seconda della tipologia di lingua per suddividere le parole in più morfemi e ridurle ad una radice (stem , da cui il nome ). L’algoritmo usato è lo snow ball .Va fatta attenzione che l’algoritmo usato può estrarre lemmi errati se usato verso una lingua con un dizionario non corretto :

select ts_debug('italian','radar'); (asciiword,"Word, all ASCII",radar,{italian_stem},italian_stem,{rad})

select ts_debug('english','radar'); (asciiword,"Word, all ASCII",radar,{english_stem},english_stem,{radar})

TIPS : NON E’ APPLICABILE A LINGUE ISOLANTI COME IL CINESE O IL VIETNAMITA

Page 19: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Stem o Stemmer

select to_tsvector('italian','radar')@@to_tsquery('italian','rado');

TRUE

select to_tsvector('english','radar')@@to_tsquery('italian','rado');

FALSE

TIPS: risolvo il problema creando una colonna che cataloga la lingua del documento o creando un dizionario di sinonimi

Page 20: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Stem o Stemmer

CREATE TEXT SEARCH DICTIONARY italian_stem ( TEMPLATE = snowball, Language = italian, StopWords = italian);

N.B. il dizionario è già presente di default.

testfulltext=# \dFd+ italian_stem List of text search dictionaries Schema | Name | Template | Init options | Description ------------+--------------+---------------------+---------------------------------------------+--------------------------------------- pg_catalog | italian_stem | pg_catalog.snowball | language = 'italian', stopwords = 'italian' | snowball stemmer for italian language

Page 21: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token LemmaDizionario Stem o Stemmer

Lista dizionari ( comando \dFd ): List of text search dictionaries Schema | Name | Description ------------+--------------------+----------------------------------------------------------- pg_catalog | danish_stem | snowball stemmer for danish language pg_catalog | dutch_stem | snowball stemmer for dutch language pg_catalog | english_stem | snowball stemmer for english language pg_catalog | finnish_stem | snowball stemmer for finnish language pg_catalog | french_stem | snowball stemmer for french language pg_catalog | german_stem | snowball stemmer for german language pg_catalog | hungarian_stem | snowball stemmer for hungarian language pg_catalog | italian_stem | snowball stemmer for italian language pg_catalog | norwegian_stem | snowball stemmer for norwegian language pg_catalog | portuguese_stem | snowball stemmer for portuguese language pg_catalog | romanian_stem | snowball stemmer for romanian language pg_catalog | russian_stem | snowball stemmer for russian language pg_catalog | simple | simple dictionary: just lower case and check for stopword pg_catalog | spanish_stem | snowball stemmer for spanish language pg_catalog | swedish_stem | snowball stemmer for swedish language pg_catalog | turkish_stem | snowball stemmer for turkish language

Page 22: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token LemmaAlgoritmo Snow Ball

L’algoritmo Snow Ball si basa su una serie di concetti:

1. Vi sono 3 tipologie di suffissi :a. tipo A: additivi ( attached )

“spedire”+”gli”+”lo”=”spedirglielo”b. tipo I: flessivi ( infletional ) , ovvero definiti dalla

grammatica, come per i passivi inglesi o i plurali : “have”+”ing” = “having”

“fit”+”ed” = “fitted”c. tipo D: derivativi ( derivation ) ovvero come gli additivi, ma

danno origine ad un moferma di senso compiuto il cui significato è diverso dall’originale, spesso in antitesi. “lancia”+”fiamme” = “lanciafiamme”

Page 23: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Algoritmo Snow Ball

● I prefissi non vengono considerati :○ poichè possono incidere profondamente sul significato di

una parola○ perchè vi sono casi di parole con suffissi e prefissi e per

semplificare l’algoritmo si considerano solo i suffissi● Zona R1 : Data una parola P[1,n] è la parte di P[k+1,n] , dove k

è la posizione della prima consonante che segue una vocale o la parte nulla di P se non esiste tale consonante :P[1,n].R1 = { se esiste k : P[k+1,n] , altrimenti [] }

● Zona R2 : Data una parola P[1,n], se Q=P[1,n].R1 , allora P[1,n].R2 => Q[1,n-k+1].R1

Page 24: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Algoritmo Snow Ball

● Zona RV : data una parola P[1,n] :○ se la seconda lettera è consonante e k è la posizione della

prima vocale in P[3,n]P[1,n].ZV => P[k+1,n]

○ se P[1,2] sono entrambi vocali e k è la posizione della prima consonante P[1,n].ZV => P[k+1,n]

○ in tutti gli altri casiP[1,n].ZV => P[4,n]

Page 25: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Snow Ball Algorithm (per lingua italiana)

sostituzione [ á , é , í , ó , ú , à , è , ì , ò , ù ] con [ a , e , i , o , u , à , è , ì , ò , ù ]

Individuazione zone R1 e R2 e RV

Fase 0: eliminazione pronomi se seguono [e|a]ndo e altrimenti [e|a|i]r sostituiti con “e”

Fase 1: rimozione suffissi standard o sostituzione degli stessi in regione R2 o R1

Fase 2: rimozione suffissi dei verbi o sostituzione degli stessi in regione RV

Fase 3: eliminazione a, e, i, o, à, è, ì o ò in coda RV e della ì se precede RV.

Fase 4: sostituzione ch con c e gh con g nella coda della parola

Page 26: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Inspell

E’ un dizionario morfologico, ovvero con i morfemi e ad ogni morfema è associato il rispettivo lemma. Inotre contiene gli affissi ( == [suf|pre|in]fissi ) e le stop words. I dizionari si possono trovare nel extension (.osx) exchange di LibreOffice in genere in licenza GPL 3

CREATE TEXT SEARCH DICTIONARY italian_hunspell (TEMPLATE = ispell,DictFile = italian_hunspell,AffFile = italian_hunspell,StopWords = italian

);TIPS: in genere è più performante dello SnowBall

Page 27: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Inspell

Questo è possibile se si sono aggiunti:

● dizionario :○ /usr/share/postgresql/9.3/tsearch_data/italian_hunspell.dict

● affissi :○ /usr/share/postgresql/9.3/tsearch_data/italian_hunspell.affix

● N.B. le stop word sono già presenti

Page 28: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Sinonimi

Il dizionario dei sinonimi è utile nel caso dello SnowBall e in genere dove vi sono documenti di origine diversa.

CREATE TEXT SEARCH DICTIONARY my_synonym ( TEMPLATE = synonym, SYNONYMS = my_synonyms);

Page 29: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Sinonimi

Il file del dizionario dei sinonimi (*.syn) è così composto :

parola lemma..parola lemma

Si possono usare “*” per identificare più desinenze

Page 30: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token Lemma

Dizionario Thesaurus

A differenza del dizionario ispell o huspell, il dizionario Thesaurus associa termini/parole [chiamati synonyms] ad una parola definita (in genere rappresenta una categoria) [chiamata preferred term ] e permette l’analisi di frasi.Condizione necessaria: tutte le parole devono essere presenti nel sottodizionarioSe si cambia il thesaurus, vanno reindicizzati i documenti, visto che dipende dalla relatione tra preferred term e synonym .

http://www.sai.msu.su/~megera/oddmuse/index.cgi/Thesaurus_dictionary

Page 31: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Configurazione FTSConfigurazione FTS

Una configurazione FTS è composta da :● Un parser● Un insieme di categorie di token● Una mappatura tra le categorie di token e i dizionari

N.B. una categoria di token può essere associata a più dizionari in base ad un ordine di precedenza

Page 32: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Configurazione FTSConfigurazione FTSConfigurazione parser di default :

testfulltext=# \dFp+ defaultText search parser "pg_catalog.default"

Method | Function | Description-----------------+----------------+------------- Start parse | prsd_start | (internal) Get next token | prsd_nexttoken | (internal) End parse | prsd_end | (internal) Get headline | prsd_headline | (internal) Get token types | prsd_lextype | (internal)

Page 33: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Dizionario Token LemmaConfigurazione FTS

Token types for parser "pg_catalog.default" Token name | Description -----------------+------------------------------------------ asciihword | Hyphenated word, all ASCII asciiword | Word, all ASCII blank | Space symbols email | Email address entity | XML entity file | File or path name float | Decimal notation host | Host hword | Hyphenated word, all letters hword_asciipart | Hyphenated word part, all ASCII hword_numpart | Hyphenated word part, letters and digits hword_part | Hyphenated word part, all letters int | Signed integer numhword | Hyphenated word, letters and digits numword | Word, letters and digits protocol | Protocol head sfloat | Scientific notation tag | XML tag uint | Unsigned integer url | URL url_path | URL path version | Version number word | Word, all letters

Page 34: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Configurazione FTSConfigurazione FTScreate text search configuration public.italian_hunspell ( COPY = pg_catalog.italian );

Text search configuration "public.italian_hunspell"Parser: "pg_catalog.default" Token | Dictionaries-----------------+-------------- asciihword | italian_stem asciiword | italian_stem email | simple file | simple float | simple host | simple hword | italian_stem hword_asciipart | italian_stem hword_numpart | simple hword_part | italian_stem int | simple numhword | simple numword | simple sfloat | simple uint | simple url | simple url_path | simple version | simple word | italian_stem

Page 35: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Configurazione FTSConfigurazione FTS

Rimozione di categoria di token che non necessitano di indicizzazione

ALTER TEXT SEARCH CONFIGURATION public.italian_hunspell DROP MAPPING FOR email, url, url_path, sfloat, float,file,host,int,version ;

testfulltext=# \dF+ public.italian_huspellText search configuration "public.italian_huspell"Parser: "pg_catalog.default" Token | Dictionaries-----------------+-------------- asciihword | italian_stem asciiword | italian_stem hword | italian_stem hword_asciipart | italian_stem hword_numpart | simple hword_part | italian_stem numhword | simple numword | simple uint | simple word | italian_stem

Page 36: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Configurazione FTSConfigurazione FTS

Rimozione di categoria di token che non necessitano di indicizzazione

ALTER TEXT SEARCH CONFIGURATION public.italian_huspell ALTER MAPPING FOR asciihword,asciiword,hword,hword_asciipart,hword_part,word with italian_hunspell,italian_stem;

In questo modo usiamo due dizionari quello hunspell e quello stemmer basato su snow ball.

Parser: "pg_catalog.default" Token | Dictionaries -----------------+------------------------------- asciihword | italian_hunspell,italian_stem asciiword | italian_hunspell,italian_stem hword | italian_hunspell,italian_stem hword_asciipart | italian_hunspell,italian_stem hword_numpart | simple hword_part | italian_hunspell,italian_stem numhword | simple numword | simple uint | simple word | italian_hunspell,italian_stem

Page 37: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Configurazione FTSConfigurazione FTSTest :SELECT * FROM ts_debug('public.italian_hunspell','Sono andato a Roma tempo fa, ho vistola fontana di Trevi e i Musei Vaticani'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+----------+---------------------------------+------------------+------------ asciiword | Word, all ASCII | Sono | {italian_hunspell,italian_stem} | italian_hunspell | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | andato | {italian_hunspell,italian_stem} | italian_hunspell | {andato} blank | Space symbols | | {} | | asciiword | Word, all ASCII | a | {italian_hunspell,italian_stem} | italian_hunspell | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | Roma | {italian_hunspell,italian_stem} | italian_hunspell | {roma} blank | Space symbols | | {} | | asciiword | Word, all ASCII | tempo | {italian_hunspell,italian_stem} | italian_hunspell | {tempo} blank | Space symbols | | {} | | asciiword | Word, all ASCII | fa | {italian_hunspell,italian_stem} | italian_hunspell | {fare} blank | Space symbols | , | {} | | asciiword | Word, all ASCII | ho | {italian_hunspell,italian_stem} | italian_hunspell | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | visto | {italian_hunspell,italian_stem} | italian_hunspell | {visto} blank | Space symbols | | {} | | asciiword | Word, all ASCII | la | {italian_hunspell,italian_stem} | italian_hunspell | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | fontana | {italian_hunspell,italian_stem} | italian_hunspell | {fontana} blank | Space symbols | | {} | | asciiword | Word, all ASCII | di | {italian_hunspell,italian_stem} | italian_stem | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | Trevi | {italian_hunspell,italian_stem} | italian_hunspell | {trevo} blank | Space symbols | | {} | | asciiword | Word, all ASCII | e | {italian_hunspell,italian_stem} | italian_hunspell | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | i | {italian_hunspell,italian_stem} | italian_hunspell | {} blank | Space symbols | | {} | | asciiword | Word, all ASCII | Musei | {italian_hunspell,italian_stem} | italian_hunspell | {museo} blank | Space symbols | | {} | | asciiword | Word, all ASCII | Vaticani | {italian_hunspell,italian_stem} | italian_hunspell | {vaticano}

Page 38: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: IndexVi sono due tipi di indici per le ricerche FTS:

● GIN Index = Generalized Inverted Index, indici esatti , tempo di build molto alto rispetto ai GIST (3X) e occupano molto più spazion (3x) . Non salvano i “pesi” dei lemmi, ergo non sono adatti per ricerche di rank. Le performance vanno come log( Numero di lemmi univoci )

● GIST Index = Generalized Search Tree, Lossy. Data la loro natura necessitanodi un fetching della riga per scartare i false match.

Gli indici GIN e GIST necessitano un campo ts_vector da indicizzare, i GIN sono in grado di indicizzare anche un campo ts_query.

Page 39: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: IndexTips per velocizzare la ricerca :

● Partizionare: il tempo per creare un indice su una tabella di enormi dimensioni <> somma del tempo delle tabelle partizionate. Se avete 32 core, e avete 20 thread per reindicizzare, sarete almeno 20x più veloci [ NB: a meno di bottleneck di disco!]

● Indicizzare “quello che serve!“● Per gli indici GIST: creare colonna con datatype tsvector in

modo da evitare che il check automatico applichi il ts_vector che equivale ad un parsing del documento in meno. Tale colonna può essere popolata tramite trigger o in delay [es. update a fine giornata o con code etc]. Si può porla su altra tabella.

● Per gli indici GIN aumentare la maintenance_work_mem , evitare il sort a disco.

● NON USARE RANK SUI GIN

Page 40: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: IndexTips per velocizzare la ricerca :

ID documento ID to_tsvector(estrazione[documento])

ID info1 infon

Se ts_vector << documento il clustering factor dell’indice migliora , riducendo i random i/o sul sistema!

Page 41: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: Index

Esempio con GIST :

testfulltext=# \d textmaster Table "public.textmaster" Column | Type | Modifiers----------------+----------+----------- id | bigint | testo | text | testo_tsvector | tsvector |Triggers:

textmaster_trigger BEFORE INSERT ON textmaster FOR EACH ROW EXECUTE PROCEDURE textmaster_insert_trigger()Number of child tables: 701 (Use \d+ to list them.)

2.2 milioni circa di articoli di wikipedia

testfulltext=# select count(*) from textmaster ; count --------- 2184547(1 row)

Time: 656.115 ms

Page 42: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: Index

Esempio con GIST :

testfulltext=# select id from textmaster where testo_tsvector::tsvector@@to_tsquery('italian_hunspell','Adige') ;

Time: 1198.207 ms

Append (cost=0.00..33561.94 rows=9217 width=8) -> Seq Scan on textmaster (cost=0.00..0.00 rows=1 width=8) Filter: (testo_tsvector @@ '''adige'''::tsquery) -> Bitmap Heap Scan on textslave_000 (cost=4.17..12.63 rows=4 width=8) Recheck Cond: (testo_tsvector @@ '''adige'''::tsquery) -> Bitmap Index Scan on textslave_000_idx01 (cost=0.00..4.17 rows=4 width=0)

Page 43: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: Index

Esempio con GIST :

testfulltext=# select id,ts_rank_cd(testo_tsvector, query ) AS rank from textmaster , to_tsquery('italian_hunspell','Adige') querywhere query @@ testo_tsvectororder by rank DESClimit 10 ;

id | rank----------+------ 60879424 | 20.5 61789700 | 11.4 61917225 | 11.1 61925407 | 10.4 61725534 | 8.1 61893871 | 8 43858831 | 7.1 51809299 | 6.6 61921488 | 6.5 39893606 | 6

Time: 1195.045 ms

Page 44: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: Index

Esempio con GIN :

select id from textmastergin where to_tsvector('italian_hunspell',testo)@@to_tsquery('italian_hunspell','Adige') ;

Time: 100.330 ms

Append (cost=0.00..42022.61 rows=11374 width=8) -> Seq Scan on textmastergin (cost=0.00..0.00 rows=1 width=8) Filter: (to_tsvector('italian_hunspell'::regconfig, testo) @@ '''adige'''::tsquery) -> Bitmap Heap Scan on textginslave_000 (cost=8.05..17.53 rows=6 width=8) Recheck Cond: (to_tsvector('italian_hunspell'::regconfig, testo) @@ '''adige'''::tsquery) -> Bitmap Index Scan on textginslave_000_idx01 (cost=0.00..8.05 rows=6 width=0) Index Cond: (to_tsvector('italian_hunspell'::regconfig, testo) @@ '''adige'''::tsquery) -> Bitmap Heap Scan on textginslave_001 (cost=8.05..17.53 rows=6 width=8) Recheck Cond: (to_tsvector('italian_hunspell'::regconfig, testo) @@ '''adige'''::tsquery) -> Bitmap Index Scan on textginslave_001_idx01 (cost=0.00..8.05 rows=6 width=0)

Page 45: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: Index

Esempio con GIN : (bitmap scan on)

explain select id,ts_rank_cd(to_tsvector('italian_hunspell',testo), query ) AS rank from textmastergin , to_tsquery('italian_hunspell','Adige') querywhere query @@ to_tsvector('italian_hunspell',testo)

Limit (cost=42605.06..42605.08 rows=10 width=466) -> Sort (cost=42605.06..42633.64 rows=11433 width=466) Sort Key: (ts_rank_cd(to_tsvector('italian_hunspell'::regconfig, textmastergin.testo), query.query)) -> Nested Loop (cost=0.00..42358.00 rows=11433 width=466) -> Function Scan on query (cost=0.00..0.01 rows=1 width=32) -> Append (cost=0.00..42186.43 rows=11439 width=434) -> Seq Scan on textmastergin (cost=0.00..0.00 rows=1 width=40) Filter: (query.query @@ to_tsvector('italian_hunspell'::regconfig, testo)) -> Bitmap Heap Scan on textginslave_000 (cost=8.05..17.53 rows=6 width=40) Recheck Cond: (query.query @@ to_tsvector('italian_hunspell'::regconfig, testo)) -> Bitmap Index Scan on textginslave_000_idx01 (cost=0.00..8.05 rows=6 width=0) Index Cond: (query.query @@ to_tsvector('italian_hunspell'::regconfig, testo)) -> Bitmap Heap Scan on textginslave_001 (cost=8.05..17.53 rows=6 width=40) Recheck Cond: (query.query @@ to_tsvector('italian_hunspell'::regconfig, testo))

Page 46: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Speed Up Search: IndexGIN => bitmapscan ON è positivo :

testfulltext=# set enable_bitmapscan=off;SETTime: 0.288 mstestfulltext=# select id,ts_rank_cd(to_tsvector('italian_hunspell',testo), query ) AS rank from textmastergin , to_tsquery('italian_hunspell','Adige') query where query @@ to_tsvector('italian_hunspell',testo) and id < 5000000;NOTICE: word is too long to be indexedDETAIL: Words longer than 2047 characters are ignored.Time: 9223.952 ms

testfulltext=# set enable_bitmapscan=on;SETTime: 0.219 mstestfulltext=# select id,ts_rank_cd(to_tsvector('italian_hunspell',testo), query ) AS rank from textmastergin , to_tsquery('italian_hunspell','Adige') query where query @@ to_tsvector('italian_hunspell',testo) and id < 5000000;Time: 99.553 ms

Page 47: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Query FTS

Query

TIPS: Prima di applicare un predicato, verificare che il predicato abbia senso ! Usare numnode ( query ) > 0 !

all’interno della tsquery : | = OR ; & = AND ; ! = NOT

tsvector || tsvector == uniamo i vettori tsquery || tsquery == OR tra i predicatitsquery && tsquery == AND tra i predicati!! tsquery == NOT tsquery

Page 48: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Query FTS

Weight

Abbiamo visto gli operatori booleani nel to_tsquery , oltre a questa forma di predicato vi è la possibilità di associare dei “pesi”:

‘lemma’[:posizione[peso]] , ‘lemma’[:posizione[peso]]

I pesi sono 4 : ‘A’,’B’,’C’,’D’ , di default il peso è ‘D’ = 1.0 ed è il più alto. Le altre categorie pesano rispettivamente 0.1,0.2,0.4.

Page 49: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Query FTS

Funzioni di RANK

ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ])

ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ])

Si basa sul CDR ( http://www.sai.msu.su/~megera/wiki/NewExtentsBasedRanking )1. Calcola un peso per ogni extent ( parte del documento in cui vi

sono lemmi sufficienti a soddisfare il predicato ) che è inversamente proporzionale ai lemmi che non soddisfano il predicato presenti nel extent.

2. Fa una assunzione e assume tutti gli extent uguali.

Page 50: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Query FTS

Funzioni di RANK

metodologie di normalizzazione:

● 1 - 1+log (lunghezza documento)● 2 - lunghezza documento● 4 - distanza armonica tra gli extent ( solo CDR )● 8 - numero di lemmi univoci nel documento● 16 - 1+log (lunghezza documento)● 32 rank/(rank+1)

Page 51: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Query FTS

Funzioni di Headline

ts_headline('configurazione',testo, ts_query) : permette l’estrazione di una parte del testo del documento significativo.

Headline + RANK = modalità di ricerca con presentazione del risultato più attinente

Page 52: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Query FTS

Esempio

select id,ts_headline('italian_hunspell',testo, query) , ts_rank(to_tsvector('italian_hunspell',testo), query,4 ) AS rank from textmastergin , to_tsquery('italian_hunspell','Laghi & Veneto & !spam') query where query @@ to_tsvector('italian_hunspell',testo) and id < 30000000 order by rank DESC;

id | substr | rank ----------+----------------------------------------------------+------------- 28432994 | #REDIRECT [[<b>Lago</b> (Revine <b>Lago</b>)]] +| 0.160671 6452799 | <b>lago</b> omonimo e collega il <b>Veneto</b> con | 0.111233 25370226 | <b>Lago</b> di Santa Croce. L'immagine è ottenuta | 0.000212121

Proviamo a velocizzare..

Page 53: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

TrigramIl trigram è una extension presente in Postgres per velocizzare le ricerche similari come i like e si basa sempre su indici Gin o Gist.

Tuttavia l’idea di fondo è di dividere le parole in triplette e sotto triplette e contare le similari per capire quanto una stringa sia simile ad un’altra.

testfulltext=# select show_trgm('Prato'); show_trgm --------------------------------- {" p"," pr",ato,pra,rat,"to "}

Page 54: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Trigram

CREATE INDEX trgm_idx ON test_trgm USING gin (testo gin_trgm_ops);

SELECT * FROM test_trgm WHERE testo LIKE '%prato%pgday;

SELECT * FROM test_trgm WHERE testo ~ '(prato|pgday)';

tSELECT * FROM test_trgm WHERE testo LIKE '%Pgday%Prato%'; testo --------------------------- Il Pgday si tiene a Prato(1 row)

Page 55: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Trigramtabella indice standard :

testfulltext=# EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM test_trgm2 WHERE testo LIKE '%Pgday%Prato%'; QUERY PLAN

----------------------------------------------------------------------------------------------------------- Seq Scan on test_trgm2 (cost=0.00..19786.21 rows=1 width=22) (actual time=0.010..200.559 rows=1 loops=1) Filter: (testo ~~ '%Pgday%Prato%'::text) Rows Removed by Filter: 1048576 Buffers: shared hit=6679 Total runtime: 200.582 ms(5 rows)

Page 56: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

Trigramtabella indice trigram :

testfulltext=# EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM test_trgm WHERE testo LIKE '%Pgday%Prato%'; QUERY PLAN

------------------------------------------------------------------------------------------- Bitmap Heap Scan on test_trgm (cost=3811.20..3812.81 rows=1 width=22) (actual time=0.024..0.024 rows=1 loops=1) Recheck Cond: (testo ~~ '%Pgday%Prato%'::text) Buffers: shared hit=8 -> Bitmap Index Scan on test_trgm_idx01 (cost=0.00..3811.20 rows=1 width=0) (actual time=0.015..0.015 rows=1 loops=1) Index Cond: (testo ~~ '%Pgday%Prato%'::text) Buffers: shared hit=7 Total runtime: 0.048 ms

Page 57: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

Chi sono?

Copyright 2012 Miriade S.p.a.

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

TrigramATTENZIONE il trigram NON va bene per i predicati = :

testfulltext=# EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM test_trgm WHERE testo='Il Pgday si tiene a Prato'; QUERY PLAN

--------------------------------------------------------------------------------------------------------- Seq Scan on test_trgm (cost=0.00..19786.21 rows=1 width=22) (actual time=0.010..96.214 rows=1 loops=1) Filter: (testo = 'Il Pgday si tiene a Prato'::text) Rows Removed by Filter: 1048576 Buffers: shared hit=6679 Total runtime: 96.233 ms(5 rows)

Page 58: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

●E-Mail: [email protected]

●URL: http://www.miriade.it

●BLOG : http://blogdba.miriade.it/

●SLIDE :

Domande?

Copyright 2012 Miriade S.p.a.Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

Contacts

Page 59: Full text search | Speech by Matteo Durighetto | PGDay.IT 2013

AttribuzioneNon commercialeCondividi allo stesso modo2.5 Italia

http://creativecommons.org/licenses/by-nc-sa/2.5/it/Copyright 2013 Miriade S.p.A. - http://www.miriade.it

Copyright 2012 Miriade S.p.a.

Grazie per l'attenzione

Copyright 2012 Miriade S.p.a. Matteo Durighetto - [email protected] - ITPUG.org

PGDay.IT 2013Monash University Prato Centre

Venerdì 25 Ottobre 2013

License