2009-09-30 14 views
24

Sto utilizzando la ricerca full-text di PostgreSQL per un progetto in cui le parole di stop tradizionali ('a', 'the', 'if' ecc.) Devono essere indicizzate e ricercabili, che non è il comportamento predefinito. Ad esempio, potrei desiderare che i miei utenti trovino i risultati per la query "essere o non essere".Posso configurare le parole di arresto programmaticamente con la ricerca full-text di PostgreSQL?

Il documentation indica che è possibile ottenere ciò creando un dizionario vuoto per le parole chiave in $SHAREDIR/tsearch_data/english.stop (ad esempio), ma ciò complicherà la distribuzione; Voglio essere in grado di configurare la gestione di stop word di PostgreSQL con SQL. È possibile? In tal caso, puoi fornire una dichiarazione SQL di esempio?

risposta

34

Secondo il vostro commento sulla risposta precedente, è possibile passare facilmente tra l'utilizzo parole di stop e tutte le parole fermarsi. È possibile raggiungere questo obiettivo con una configurazione di ricerca personalizzata:

(1) È possibile creare un dizionario personalizzato senza utilizzare il file parole stop, ad esempio:

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball 
    , Language = english 
); 

nota, in quanto sopra ho lasciato fuori il StopWords parametro.

(2) quindi creare una nuova configurazione di utilizzare il nuovo dizionario:

CREATE TEXT SEARCH CONFIGURATION public.english_nostop (COPY = pg_catalog.english); 
ALTER TEXT SEARCH CONFIGURATION public.english_nostop 
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop; 

(3) Poi, quando si cerca di specificare la configurazione che si desidera utilizzare (in alternativa si può modificare l'opzione default_text_search_config ogni volta), ad esempio:

SELECT 
    title 
FROM 
    articles 
WHERE 
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,'')) 
    @@ to_tsquery('english_nostop', 'how & to'); 

È possibile specificare solo 'english' in SQL sopra per utilizzare la configurazione normale.

Note, in questo esempio che utilizza la configurazione standard si tradurrà in comunicazioni perché ci sono solo fermare parole.


Tenete a mente quanto segue, però:

  • Se si utilizza indici, avrete bisogno di due - uno per ogni configurazione. (vedere questi documenti: tsearch tables e triggers).
  • Doppio controllo su quale token del parser si desidera utilizzare questa mappatura come descritto al passaggio n. 2, sopra (vedere Parsers).
+0

Grazie, catchdave: questo è quello che stavo cercando. – tomd

2

No, le parole di arresto sono configurabili solo tramite tale file. Puoi avere una funzione lato server che modifica il file, ma che richiede che il file sia scritto: abilitato dall'utente del servizio postgres, che probabilmente non vuoi.

+1

OK, grazie. Per essere chiari, non è possibile dire a PostgreSQL di non usare * qualsiasi * file di stopword? – tomd

Problemi correlati