Tutte le query devono essere nel dizionario?
No. Perché all'inizio sono presenti solo gli stemmi di parole (in base alla configurazione della ricerca di testo utilizzata ). Ma soprattutto:
No . Perché, oltre a ciò, la ricerca full-text è anche in grado di abbinare i prefissi :
Questo funzionerebbe:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
Nota 3 cose:
Utilizzare to_tsquery()
, non plainto_tsquery()
, in questo caso perché ( citando il manuale ):
... plainto_tsquery
non riconoscerà tsquery
operatori, etichette di peso o etichette di corrispondenza dei prefissi nei suoi input
Utilizzare la 'simple'
configurazione della ricerca di testo per generare il tsquery
dato che ovviamente si desidera prendere la parola 'disp' così com'è e non applicare stemming
Aggiungi :*
per renderlo una ricerca di prefisso, cioè trova tutti i lessemi che iniziano con 'disp'.
Importante: questa è una ricerca di prefissi sui lessemi (gambi di parole) nel documento. Una corrispondenza di espressioni regolari senza caratteri jolly ( content ~* 'avail'
) non è esattamente la stessa! Quest'ultimo non è ancorato a sinistra (all'inizio dei lessemi) e troverebbe anche "FOOavail" ecc.
Non è chiaro se si desidera delineare il comportamento nella query o l'equivalente dell'espressione regolare aggiunta. Gli indici Trigram ( pg_trgm
) come già suggerito da @Evan sono lo strumento giusto per questo. Ci sono molte domande correlate su dba.SE, prova una ricerca .
Panoramica:
dimostrazione
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
Risposta correlata recente (capitolo Approccio diverso per ottimizzare la ricerca ):
Messaggi di posta elettronica?
Poiché hai menzionato le e-mail, tieni presente che il parser di ricerca del testo identifica le e-mail e non le divide in parole / lessemi separati. Ritenere:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
Sostituirei i separatori @
e .
nelle e -mail con spazio ( ' '
) per indicizzare le parole contenute.
Inoltre, poiché hai a che fare con i nomi nelle e-mail, non con le parole inglesi (o di qualche altra lingua) , utilizzerei la 'simple'
configurazione della ricerca di testo per disabilitare le funzionalità di traduzione e altre lingue :
Costruisci la ts_vector
colonna con:
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
documentato, e 2) non dovresti menzionare cheto_tsvector('simple'..)
vanno di pari passo con le istruzioni che le future interrogazioni di quel tsv richiederanno anche la configurazione "semplice" di tsquery? Penso che dovresti chiarire le conseguenze della disabilitazione derivante da un tsvector / tsquery.