我目前正在开发一个允许在PostgreSQL数据库上搜索的网站,该搜索与to_tsquery()
一起使用,我正在尝试找到一种方法来验证输入,然后将其作为查询发送。
除此之外,我还试图添加一个短语能力,所以如果有人搜索HELLO | "I LIKE CATS"
,它只能找到"hello"
或整个短语"i like cats"
的结果(而不是I & LIKE & CATS
,它会找到包含所有3个单词的文章,无论如何他们可能出现在哪里)。
有没有什么理由让DB服务器验证它太昂贵?在客户端复制ts_query解析算法似乎有点过分。
如果担心你不希望它每次验证时都尝试运行整个查询(可能会涉及表访问),你可以在较小的查询中使用输入,只是在伪代码中(这可能看起来有点像Python,但这只是巧合):
is_valid_query(input):
try:
execute("SELECT ts_query($1)", input);
return True
except DatabaseError:
return False
关于措辞,最简单的方法是首先使用非措辞查询(使用索引)进行搜索,然后对具有短语的那些进行过滤。这可以在服务器端或客户端完成。根据所解析的语言,构造处理重复空格或其他可忽略符号的短语的简单正则表达可能是最容易的。
缺点是您需要一些额外的代码来将查询转换为适当的宽松查询,然后将其转换为正则表达式。
最后,PostgreSQL中可能有一种技术可以使用存储在ts_vectors中的词法位置进行正确的短语搜索。我猜测短语搜索是预期用途之一,但我在粗略搜索中找不到它的一个例子。至少在http://linuxgazette.net/164/sephton.html底部附近有一个部分。