2011-04-17 92 views
2

我有一個包含35個字段(Char,Int,Bool,Dec,M2M,FK)的UserProfile模型。作爲搜索查看功能的一部分,其中一個字段需要全文搜索,而剩餘的34個字段將用於提供「高級搜索過濾」(使用__gte,__ lte,__ exact,__in和__startswith)。搜索查詢可以使用5-35個字段作爲搜索查看標準。django-haystack:通過索引數據庫選擇一個大的SearchIndex

我使用haystack來建立一個SearchIndex,並且目前已經添加了所有35個字段,但這似乎是無效的,因爲我繞過了django ORM(?)。

Filter Django Haystack results like QuerySet?的答案表明,我可以將SearchIndex中的單個全文搜索字段存儲起來,並將SearchQuerySet與django的QuerySet組合起來用於其餘的34個過濾字段。那麼我會在我的django模型的某些或所有這些字段上使用db_index = True?使用這種兩階段查詢合併方法能夠很好地適應數以千計的結果嗎?

由於我的UserProfile模型可能增長到300K-2M條目,我想了解如何最好地爲這個模型建立索引。作爲數據庫索引和搜索的新手,我正在尋找關於如何最優化我的數據庫的任何見解。

回答

0

將兩者混合可能無法擴展。當你構建一個查詢集或一個SearchQuerySet時,查詢實際上並不運行,直到你在某處查詢結果,所以它們在這個意義上是懶惰的。

但是,如果你這樣做

results = [ r.pk for r in searchqueryset ]

它實際上執行對草垛/ Solr的該查詢。如果您總共查看2M條目,這意味着您的列表可能會返回2M條目。現在你正在向MySQL發送一個2M列表(使用ORM)來進一步過濾。這永遠不會顯着放大。

如果你只是堅持乾草堆,那麼繼續構建searchqueryset,它只會在訪問結果時執行一次。還要記住減少{{result.object}},因爲它也會觸發每個結果的數據庫。

你可以看看load_all(),刻面等。