2010-10-25 73 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