postgresql全文搜索查询到Django ORM

问题描述:

我正在关注postgresql中FullTextSearch的documentation。我创建了一个tsvector列并添加了我需要的信息,最后我创建了一个索引。 现在,要做搜索,我必须执行这样postgresql全文搜索查询到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; 

我希望能够与Django的ORM执行这个,所以我可以得到的对象的查询。 (这里有一个小问题:是否需要将tsvector列添加到我的模型中?) 我的猜测是我应该使用extra()更改查询集中的“where”和“tables”

也许如果我更改查询到这一点,它会更容易:

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 

所以ID”必须做这样的事情:

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

Thxs您的帮助:) 另一件事,我使用Django 1.1

警告:我摇晃的火车写这个,有皮肤炎,但这应该做的伎俩:

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']) 

如果你是在Django的1.2,你可以只要致电:

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

我试过了,但它引发了一个错误,说这个查询的语法存在问题,这很奇怪,因为我接受了qs.query并直接在数据库中执行,并且它工作正常,我猜问题出在“plainto_tsquery('%s')中的单引号” – pleasedontbelong 2010-08-13 08:54:49

+1

http://barryp.org/blog/entries/postgresql-full-text-sear ch-django /使用“额外” – Stefano 2012-07-20 10:22:47