to_tsquery()验证

时间:2011-07-18 16:08:16

标签: validation postgresql

我目前正在开发一个允许在PostgreSQL上搜索的网站 数据库,搜索与to_tsquery()一起使用,我试图找到一种方法来验证输入作为查询发送之前。

除此之外,我还尝试添加短语功能,以便在有人搜索HELLO | "I LIKE CATS"时,只会找到"hello"或整个短语"i like cats"的结果(如反对I & LIKE & CATS,会找到包含所有3个单词的文章, 无论它们出现在哪里)。

1 个答案:

答案 0 :(得分:1)

有什么理由让DB服务器验证它太贵了吗?在客户端复制ts_query解析算法似乎有点过分。

如果担心的是你不希望它每次验证时都尝试运行整个查询(可能会涉及表访问),你可以在较小的查询中使用输入,只需要伪代码(可能看起来很像)有点像Python,但这只是巧合):

is_valid_query(input):
    try:
        execute("SELECT ts_query($1)", input); 
        return True
    except DatabaseError:
        return False

关于措辞,最简单的方法是首先使用非语法查询(使用索引)进行搜索,然后对具有短语的语句进行过滤。这可以在服务器端或客户端完成。根据要解析的语言,构造处理重复空格或其他可忽略符号的短语的简单正则表达可能是最简单的。

  1. 搜索to_tsquery('HELLO |(I& LIKE& CATS)'),找回松散匹配的文档列表。
  2. 在客户端中,将其过滤为与正则表达式“HELLO |(I \ s + LIKE \ s + CATS)”匹配的那些。
  3. 缺点是您需要一些额外的代码来将查询转换为适当的宽松查询,然后将其转换为正则表达式。

    最后,可能是PostgreSQL中的一种技术,可以使用存储在ts_vectors中的词法位置进行正确的短语搜索。我猜测短语搜索是预期用途之一,但我在粗略搜索中找不到它的一个例子。至少在http://linuxgazette.net/164/sephton.html底部附近有一个部分。