Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi ricerca testo
PrecedenteTipi stringa di bitTipo UUIDSuccessivo

8.11. Tipi ricerca testo

PostgreSQL™ provides two data types that are designed to support full text search, which is the activity of searching through a collection of natural-language documents to locate those that best match a query. The tsvector type represents a document in a form optimized for text search; the tsquery type similarly represents a text query. Capitolo 12, Full Text Search provides a detailed explanation of this facility, and Sezione 9.13, «Funzioni e operatori per ricerca testo» summarizes the related functions and operators. PostgreSQL™ fornisce due tipi di dato che sono destinati a supportare ricerche complete di testo, che è l'attività di ricerca tramite una raccolta di documenti in linguaggio-naturale per individuare quello che meglio corrisponde ad una query. Il tipo tsvector rappresenta un documento in una forma adatta per la ricerca di testo, mentre il tipo tsquery similmente rappresenta una query. Il Capitolo 12, Full Text Search fornisce una spiegazione dettagliata di queste strutture, e Sezione 9.13, «Funzioni e operatori per ricerca testo» riassume le funzioni e gli operatori connessi.

8.11.1. tsvector

A tsvector value is a sorted list of distinct lexemes, which are words that have been normalized to merge different variants of the same word (see Capitolo 12, Full Text Search for details). Sorting and duplicate-elimination are done automatically during input, as shown in this example: Un valore tsvector è una lista ordinata di distinti lessemi, che sono parole normalizzate per raggruppare diverse varianti somiglianti della stessa parola (vedere il Capitolo 12, Full Text Search per dettagli). L'ordinamento e l'eliminazione dei duplicati sono fatti automaticamente durante l'input, come mostrato in questo esempio:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
                      tsvector
----------------------------------------------------
 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'

Per rappresentare lessemi contenenti spazi bianchi o segni di punteggiatura, usare gli apici:

SELECT $$the lexeme '    ' contains spaces$$::tsvector;
                 tsvector                  
-------------------------------------------
 '    ' 'contains' 'lexeme' 'spaces' 'the'

(In questo esempio e nel prossimo usiamo il dollaro per evitare la confusione di dover raddoppiare gli apici all'interno dei letterali.) Gli apici e le barre inverse interne devono essere raddoppiate:

SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
                    tsvector                    
------------------------------------------------
 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'

Optionally, integer positions can be attached to lexemes: Opzionalmente, posizioni intere possono essere aggiunte a uno o a tutti i lessemi:

SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
                                  tsvector
-------------------------------------------------------------------------------
 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4

Una posizione indica normalmente la posizione della parola sorgente nel documento. L'informazione posizionale può essere usata per una classificazione di prossimità. I valori di posizione possono estendersi da 1 a 16383; numeri più grandi vengono automaticamente impostati a 16383. Posizioni duplicate per lo stesso lessema vengono scartate.

Lexemes that have positions can further be labeled with a weight, which can be A, B, C, or D. D is the default and hence is not shown on output: I lessemi che hanno posizioni possono ulteriormente essere etichettati con un peso, che può essere A, B, C, o D. D è il predefinito e quindi non viene visualizzato in uscita:

SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
          tsvector          
----------------------------
 'a':1A 'cat':5 'fat':2B,4C

I pesi vengono normalmente usati per riflettere la struttura del documento, per esempio per marcare le parole del titolo differentemente dalle parole del corpo. Le funzioni di classificazione nella ricerca di testo possono assegnare diverse priorità ai diversi marcatori di peso.

È importante capire che il tipo tsvector non effettua nessuna normalizzazione; esso assume che le parole fornite siano adeguatamente normalizzate per l'applicazione. Per esempio,

select 'The Fat Rats'::tsvector;
      tsvector      
--------------------
 'Fat' 'Rats' 'The'

Per la maggior parte delle applicazioni di ricerca-testo-inglese le parole viste sopra sarebbero considerate non-normalizzate, ma tsvector non se ne cura. I documenti di testo grezzo devono usualmente essere passati attraverso to_tsvector per normalizzare le parole appropriatamente per la ricerca:

SELECT to_tsvector('english', 'The Fat Rats');         
   to_tsvector   
-----------------
 'fat':2 'rat':3

Per ulteriori dettagli, vedere nel Capitolo 12, Full Text Search.

8.11.2. tsquery

Un valore tsquery memorizza lessemi che devono essere ricercati, e li combina utilizzando gli operatori booleani & (AND), | (OR), e ! (NOT). Possono essere utilizzate parentesi per far rispettare il raggruppamento degli operatori:

SELECT 'fat & rat'::tsquery;
    tsquery    
---------------
 'fat' & 'rat'

SELECT 'fat & (rat | cat)'::tsquery;
          tsquery          
---------------------------
 'fat' & ( 'rat' | 'cat' )

SELECT 'fat & rat & ! cat'::tsquery;
        tsquery         
------------------------
 'fat' & 'rat' & !'cat'

In assenza di parentesi, ! (NOT) ha la precedenza e & (AND) ha la precedenza su | (OR).

Opzionalmente, i lessemi in un tsquery possono essere identificati con una o più lettere di peso, che li costringono ad abbinarsi solo con lessemi tsvector di peso corrispondente:

SELECT 'fat:ab & cat'::tsquery;
    tsquery
------------------
 'fat':AB & 'cat'

Inoltre, i lessemi in un tsquery possono essere etichettati con *, per specificarei il prefisso di corrispondenza:

SELECT 'super:*'::tsquery;
  tsquery  
-----------
 'super':*

Questa query troverà ogni parola in un tsvector che comincia con «super».

Le regole per quotare i lessemi sono le stesse descritte precedentemente per i lessemi in tsvector; E, come con tsvector, ogni normalizzazione richiesta delle parole deve essere fatta prima della conversione al tipo tsquery. La funzione to_tsquery è conveniente per realizzare tale normalizzazione:

SELECT to_tsquery('Fat:ab & Cats');
    to_tsquery    
------------------
 'fat':AB & 'cat'

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi ricerca testo
PrecedenteTipi stringa di bitTipo UUIDSuccessivo