2014-02-06 25 views
1

我正在尋找一種方法來搜索特定表達式 - 然後是它的一部分 - 在所有文檔(及其相關聯的值)中。最終的順序應爲:PostgreSQL 9.1:在標題中查找確切表達式

  1. 完整表達(在標題或內容):使用ILIKE和「%表達%」
  2. 其中一個字的(在標題或內容):使用tsquery上的tsvector索引的列

我有兩個表:

  • 文檔(ID [整數],標題[字符改變],title_search [的tsvector])
  • 值(ID [整數],內容[字符改變],content_search [的tsvector],id_document [整數])

這裏的要求,我現在在做什麼:

(SELECT id, title, content, title_search, content_search, ts_rank_cd(title_search, query) AS rank 
    FROM to_tsquery('lorem&ipsum|(lorem|ipsum)') query, documents 
    LEFT JOIN "values" ON id_document=id 
    WHERE (title ILIKE(unaccent('%lorem ipsum%')) OR content ILIKE(unaccent('%lorem ipsum%')))) 
UNION (SELECT id, title, content, title_search, content_search, ts_rank_cd(title_search, query) AS rank 
    FROM to_tsquery('lorem&ipsum|(lorem|ipsum)') query, documents 
    LEFT JOIN "values" ON id_document=id 
    WHERE query @@ title_search) 
UNION (SELECT id, title, content, title_search, content_search, ts_rank_cd(title_search, query) AS rank 
    FROM to_tsquery('lorem&ipsum|(lorem|ipsum)') query, documents 
    LEFT JOIN "values" ON id_document=id 
    WHERE query @@ content_search) 
ORDER BY rank DESC, title ASC 

通過這樣做,我可以使用這個表達式和/或它的一部分獲取所有文檔,但是我不能讓這些文檔正確對準。這是因爲我依賴的是tsvector字段上的ts_rank而不能用於定義精確表達式。

所以我的問題是如何讓我的工作如我所期望的那樣?我使用全文搜索錯了嗎?

謝謝。

回答

1

這有點尷尬,但我之前使用的解決方案是在您的單個子查詢中包含額外的「排名」列。例如,拳頭查詢看起來像

select 1 as which_rank, id, title, ... 
.... 
where title ILIKE(unaccent('%lorem ipsum%')) 
    OR content ILIKE(unaccent('%lorem ipsum%'))) 

那麼第二個是

select 2 as which_rank, id, title, ... 
... 
where query @@ title_search 

第三是

select 3 as which_rank, id, title, ... 
... 
where query @@ content_search 

如果包含在您的排序順序排名值:

ORDER BY which_rank asc, rank DESC, title ASC 

你可以確保第一個案例列入第一個,第二個和第三個。您也可以根據您的需要重新安排哪些是1,2,3。