2012-12-31 45 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

あなたが検索ワードとして扱われるように「& T AT」したい場合は、デフォルトのパーサは二つの単語としてそれを分割しているため、いくつかのカスタマイズされたコンポーネントが必要になるだろう:

[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を参照してください。

0
+1

は、例えば部分一致をサポートするために、とにかくありplainto_tsquery('AT&T)機能を使用して非常に便利なこのコメントを見つけました追加:*これで最後に? –