r_31415 Asked: 2016-04-12 21:09:07 +0800 CST2016-04-12 21:09:07 +0800 CST 2016-04-12 21:09:07 +0800 CST 过滤 to_tsquery 中的特殊字符 772 这个问题已经在这里和这里问过。我想通过to_tsquery. 但是,由于转义字符会导致复杂性,我认为简单地过滤可能引发错误的特殊字符是可以的。 我需要删除哪些字符才能安全地使用 to_tsquery。到目前为止,我已经确定了以下内容: 包含&, |, 的输入:可能会产生语法错误 输入*可能无法按预期工作(to_tsquery('a*b')产生'b') 引号需要转义 为了接受用户输入,您有什么建议to_tsquery?我需要删除哪些其他特殊字符? postgresql full-text-search 2 个回答 Voted Best Answer Ezequiel Tolnay 2016-04-12T22:51:25+08:002016-04-12T22:51:25+08:00 您可能只想在用户输入时保留它,因为您可以安全地使用通过quote_literal. 在to_tsquery文档中,ts 查询中的短语示例是: SELECT to_tsquery('''supernovae stars'' & !crab'); 在短语中添加一些垃圾会破坏它,除非您通过 quote_literal 将它传递两次,这使得任何字符串都可以安全使用: SELECT to_tsquery(quote_literal(quote_literal('supernovae '':|stars')) || ' & !crab'); Daniel Vérité 2016-04-13T12:06:32+08:002016-04-13T12:06:32+08:00 包含 &、|、: 的输入可能会产生语法错误 使用plainto_tsquery()而不是to_tsquery(). 它旨在接受自由格式的用户输入。 带 * 的输入可能无法按预期工作(to_tsquery('a*b')产生“b”) 文本配置很重要。例如, select to_tsquery('simple','a*b'); to_tsquery ------------ 'a' & 'b' select to_tsquery('english','a*b'); to_tsquery ------------ 'b' 引号需要转义 与任何文本文字相同。 $N或者,如果您的客户端环境支持,则如果使用带有 -style 参数的准备好的或参数化的语句,则不需要对它们进行转义。
您可能只想在用户输入时保留它,因为您可以安全地使用通过
quote_literal
. 在to_tsquery
文档中,ts 查询中的短语示例是:在短语中添加一些垃圾会破坏它,除非您通过 quote_literal 将它传递两次,这使得任何字符串都可以安全使用:
使用
plainto_tsquery()
而不是to_tsquery()
. 它旨在接受自由格式的用户输入。文本配置很重要。例如,
与任何文本文字相同。
$N
或者,如果您的客户端环境支持,则如果使用带有 -style 参数的准备好的或参数化的语句,则不需要对它们进行转义。