2010-10-25 9 views
4

Im nouveau à Postgres et je ne sais pas comment traduire cette requête MySQL postgre:requête FULLTEXT avec des scores/rangs dans 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; 

Répondre

9

La recherche de texte intégral Postgres est un peu différent de la recherche de texte intégral MySQL. Il a beaucoup plus d'options, mais peut être un peu plus difficile de travailler comme vous l'aimez.

Ce document indique comment classer vos résultats de recherche, mais je vous recommande vivement de lire toute la section du texte intégral du manuel pour avoir une idée de ce que vous pouvez faire avec: http://www.postgresql.org/docs/current/interactive/textsearch-controls.html#TEXTSEARCH-RANKING

En gros, l'équivalent de votre requête serait ceci:

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

Comme vous pouvez le voir, celui-ci utilise textsearch qui est quelque chose que vous aurez à vous définir. Pour la version courte, lisez: http://www.postgresql.org/docs/current/interactive/textsearch-tables.html

La requête est essentiellement très simple:

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

Mais je recommande fortement l'ajout d'index aswell:

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

Merci Wolph. Il a semblé assez difficile à comprendre au début, mais finalement je l'ai fonctionné. – sNiCKY

+0

Qu'est-ce que * '* textsearch'? Ce n'est pas un nom de colonne au moins. La documentation omet utilement ce détail. – Timmmm

+0

@Timmmm: la documentation est peut-être un peu difficile à lire dans cet aspect. C'est un 'ts_vector' que vous pouvez créer comme ceci:' SELECT to_tsvector ('anglais', 'un gros chat assis sur un tapis - il a mangé un gros rat'); ' – Wolph