2010-08-13 4 views
3

Je suivais le documentation sur FullTextSearch dans postgresql. J'ai créé une colonne tsvector et ajouté les informations dont j'avais besoin, et finalement j'ai créé un index. Maintenant, pour faire la recherche que je dois exécuter une requête comme celui-cipostgresql requête de recherche plein texte à django ORM

SELECT *, ts_rank_cd(textsearchable_index_col, query) AS rank 
FROM client, plainto_tsquery('famille age') query 
WHERE textsearchable_index_col @@ query 
ORDER BY rank DESC LIMIT 10; 

Je veux être en mesure d'exécuter avec cette ORM de Django pour que je puisse obtenir les objets. (Une petite question ici: dois-je ajouter la colonne tsvector à mon modèle?) Ma conjecture est que je devrais utiliser extra() pour changer le "où" et "tables" dans le jeu de requête

Peut-être si je modifier la requête à cela, il serait plus facile:

SELECT * FROM client 
WHERE plainto_tsquery('famille age') @@ textsearchable_index_col 
ORDER BY ts_rank_cd(textsearchable_index_col, plainto_tsquery(text_search)) DESC LIMIT 10 

donc id » avoir à faire quelque chose comme:

Client.objects.???.extra(where=[???]) 

Thxs pour votre aide :) Une autre chose, je suis en utilisant Django 1.1

Répondre

3

caveat: J'écris ceci sur un train bancal, avec un rhume, un mais devrait faire l'affaire:

where_statement = """plainto_tsquery('%s') @@ textsearchable_index_col 
        ORDER BY ts_rank_cd(textsearchable_index_col, 
             plainto_tsquery(%s)) 
        DESC LIMIT 10""" 

qs = Client.objects.extra(where=[where_statement], 
          params=['famille age', 'famille age']) 

Si vous étiez sur Django 1.2 vous pouvez simplement appeler:

Client.objects.raw(""" 
SELECT *, ts_rank_cd(textsearchable_index_col, query) AS rank 
FROM client, plainto_tsquery('famille age') query 
WHERE textsearchable_index_col @@ query 
ORDER BY rank DESC LIMIT 10;""") 
+0

je l'ai essayé mais il y a une erreur en disant qu'il y a un problème sur la syntaxe de la requête qui est bizarre parce que j'ai pris le qs.query et exécuté directement dans la base de données, et ça fonctionne bien les guillemets simples dans le "plainto_tsquery ('% s')" – pleasedontbelong

+1

http://barryp.org/blog/entries/postgresql-full-text-sear ch-django/en utilisant "extra" – Stefano