2010-08-13 88 views
3

我正在關注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

回答

3

警告:我搖晃的火車寫這個,有皮膚炎,但這應該做的伎倆:

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