转义to_tsquery中的特殊字符

时间:2012-12-31 16:29:45

标签: postgresql full-text-search

如何在传递给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 个答案:

答案 0 :(得分:4)

如果您希望将“AT& T”视为搜索词,您将需要一些自定义组件,因为默认解析器将其拆分为两个单词:

steve@steve@[local] =# select * from ts_parse('default', 'AT&T');
 tokid | token 
-------+-------
     1 | AT
    12 | &
     1 | T
(3 rows)
steve@steve@[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

答案 1 :(得分:2)

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

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

您可以制作更复杂的查询:

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

有关详情,请参阅文字搜索docs

答案 2 :(得分:1)

我发现此评论非常有用,它使用plainto_tsquery('AT&T)函数https://stackoverflow.com/a/16020565/350195