2011-07-08 30 views
2

我試圖簡化這個查詢,因爲它將由PHP生成動態地生成,我想減少處理開銷(真正的查詢將會更長,但結構將是一樣的!)。簡化PostgreSQL全文搜索使用別名的tsvector和tsquery

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
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 
+0

謝謝,但還是失敗...錯誤:語法錯誤或接近 「爲」 LINE 7:... tweight(to_tsvector(合併(TYPE_NAME, '')), 'B')的重量, –

+0

我想我誤解了對ts_rank_cd()的調用。請嘗試新的查詢。但無論如何,這應該讓你知道如何處理這個問題。 –

+0

仍然失敗,不幸的是...與您的新編輯錯誤是錯誤:函數ts_rank_cd(數字[])不存在,我認爲是由於第5行錯誤的括號,刪除,拋出上述相同的錯誤。 ts_rank_cd params是rank數組,tsvector,tsquery。謝謝你的幫助。非常感激。 –