Yes, you can in PG too, and in fact the query in question already does so:
<blockquote><pre>
select rank_for_search('$final_query_string',
email || first_names || last_name || one_line || message::text) as the_score,
case when bboard.refers_to is null then 1 else 0 end,
bboard.*, users.first_names || ' ' || users.last_name as name, users.email, bboard_topics.presentation_type, bboard_topics.topic
from bboard, users, bboard_topics
where rank_for_search('$final_query_string', email || first_names || last_name || one_line || message::text) > 0
and bboard.user_id = users.user_id
and (active_p = 't' or active_p is null)
and (bboard_topics.moderation_policy is null or bboard_topics.moderation_policy != 'private')
and bboard_topics.topic_id = bboard.topic_id
order by 1 desc, 2 desc
</pre></blockquote>
but it is called in the WHERE clause. As you can see this is a horrible query no matter how you look at it as it does a sequential scan on the entire table. Well, not in this case which is searching a single topic (forum), but it does in the "search all forums" variant.
<p>
But at least it only calls the rank_for_search function twice rather than three times per returned row, and of course only once for each rejected row!