2012-12-31 4 views
11

Come si espongono i caratteri speciali nella stringa trasmessa a to_tsquery? Per esempio, questo tipo di query:Caratteri speciali di escape in to_tsquery

select to_tsquery('AT&T'); 

Produce:

NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored 

to_tsquery 
------------ 

(1 row) 

Edit: Ho anche notato che c'è lo stesso problema in to_tsvector.

risposta

3

Se si vuole 'AT & T' di essere trattato come una parola di ricerca, si sta andando ad avere bisogno di alcuni componenti personalizzati, perché il parser di default si divide in due parole:

[email protected]@[local] =# select * from ts_parse('default', 'AT&T'); 
tokid | token 
-------+------- 
    1 | AT 
    12 | & 
    1 | T 
(3 rows) 
[email protected]@[local] =# select * from ts_debug('simple', 'AT&T'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+-------+--------------+------------+--------- 
asciiword | Word, all ASCII | AT | {simple}  | simple  | {at} 
blank  | Space symbols | &  | {}   |   | 
asciiword | Word, all ASCII | T  | {simple}  | simple  | {t} 
(3 rows) 

come si può vedere da the documentation for CREATE TEXT PARSER questo non è molto banale, poiché sembra che il parser debba essere una funzione C.

Si potrebbe trovare questo post di qualcuno sta ottenendo "underscore_word" per essere riconosciuto come un unico token utile: http://postgresql.1045698.n5.nabble.com/Configuring-Text-Search-parser-td2846645.html

0

Una soluzione semplice è quello di creare la tsquery come segue:

select $$'AT&T'$$::tsquery; 

Si può fare più query complesse:

select $$'AT&T' & Phone | '|Bang!'$$::tsquery; 

Vedere la ricerca docs di più.

0

Ho trovato questo commento molto utile che utilizza la funzione plainto_tsquery('AT&T)https://stackoverflow.com/a/16020565/350195

+1

Esiste un modo per sostenere la corrispondenza parziale per esempio aggiungendo: * alla fine con questo? –