2012-12-31 117 views
11

如何将字符串中的特殊字符传递给to_tsquery?举例来说,这种查询:转义to_tsquery中的特殊字符

select to_tsquery('AT&T'); 

产地:

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

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

(1 row) 

编辑:我也注意到,有在to_tsvector同样的问题。

回答

3

如果你想“AT & T”被视为一个搜索词,你会需要一些定制组件,因为默认的解析器将其分解为两个词:

[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) 

,你可以从the documentation for CREATE TEXT PARSER可以看出,这不是很微不足道,因为解析器看起来需要是C函数。

您可能会发现这个帖子的人的越来越“underscore_word”被承认为一个单一的令牌有用:http://postgresql.1045698.n5.nabble.com/Configuring-Text-Search-parser-td2846645.html

0

一个简单的解决方案如下:创建tsquery:

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

可以使更复杂的查询:

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

有关更多信息,请参阅文本搜索docs