2010-10-25 70 views
4

進出口新的Postgres的,我不知道如何將這種MySQL查詢轉換爲Postgres的:;得分全文查詢/排名在PostgreSQL

SELECT pictures.id, MATCH (title, cached_tag_list) AGAINST ('phrase') AS score FROM pictures WHERE MATCH (title, cached_tag_list) AGAINST ('phrase') ORDER BY score DESC; 

回答

9

Postgres的全文搜索是從MySQL全文檢索略有不同。它有更多的選擇,但可能有點難以按照你喜歡的方式工作。

本文將告訴您如何排名的搜索結果,但我強烈建議你閱讀手冊整個全文節,以獲取有關您可以用它做什麼的想法:http://www.postgresql.org/docs/current/interactive/textsearch-controls.html#TEXTSEARCH-RANKING

基本上相當於您的查詢會是這樣:

SELECT pictures.id, ts_rank_cd(textsearch, 'phrase') AS score 
FROM pictures 
ORDER BY score DESC 

正如你可以看到,這裏採用textsearch這是你必須定義自己。對於短版閱讀:http://www.postgresql.org/docs/current/interactive/textsearch-tables.html

查詢本質上是很簡單的:

SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), 'phrase') AS score 
FROM pictures 
ORDER BY score DESC 

但我會強烈建議增加索引藏漢:

CREATE INDEX pictures_title ON pictures USING gin(to_tsvector('english', title)); 
+0

感謝Wolph。起初看起來很難理解,但最終我得到了它的工作。 – sNiCKY 2010-10-26 08:31:14

+0

什麼是*'textsearch'?至少不是列名。文檔有助於省略這些細節。 – Timmmm 2012-10-14 15:35:10

+0

@Timmmm:這方面的文檔可能有點難以閱讀。這是一個'ts_vector',你可以這樣創建:'SELECT to_tsvector('english','坐在墊子上的肥貓 - 它吃了一隻胖老鼠'); ' – Wolph 2012-10-14 19:13:28