使用别名简化PostgreSQL全文搜索tsvector和tsquery

时间:2011-07-08 10:53:41

标签: postgresql full-text-search

我正在尝试简化此查询,因为它将由PHP动态生成,我希望减少处理开销(真正的查询会更长,但结构将是相同的!)。

SELECT title, type_name, ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],
setweight(to_tsvector(coalesce(title,'')), 'A')
||
setweight(to_tsvector(coalesce(type_name,'')), 'B')
,
to_tsquery('search & query'))
FROM TestView WHERE
setweight(to_tsvector(coalesce(title,'')), 'D')
||
setweight(to_tsvector(coalesce(type_name,'')), 'B')
@@
to_tsquery('search & query');

我希望通过定义类似别名的东西来减少指定tsquery和tsvector两次的需要,这样就不必指定两次。这样的事情(失败了,我不确定它是否接近正确!)

SELECT title, type_name, ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],
searchvector
,
searchquery
FROM TestView WHERE
setweight(to_tsvector(coalesce(title,'')), 'D')
||
setweight(to_tsvector(coalesce(type_name,'')), 'B') AS searchvector
@@
to_tsquery('search & query') AS searchquery;

这是可能的还是我只是坚持生成两次。

对于上下文'TestView'是从许多表生成的视图。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

SELECT title, 
       type_name,
       ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],weight,query)
FROM (
    SELECT title, 
           type_name, 
           setweight(to_tsvector(coalesce(title,'')), 'A')
              ||setweight(to_tsvector(coalesce(type_name,'')), 'B') as weight,
           to_tsquery('search & query') as query
    FROM TestView 
) t
WHERE weight @@ query