2014-11-24 42 views
0

我使用whoosh作爲搜索後端。爲什麼使用django haystack slice queryset太慢?

,當我得到的只是3個搜索結果,代碼:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import sys 
sys.path.append('/home/guomeng/projects/tapplex_ringtones') 
import os 
os.environ['DJANGO_SETTINGS_MODULE'] = "tapplex_ringtones.settings" 

from haystack.query import SearchQuerySet 
from ringtones.models import Ringtone 
import time 

query_word = u'sky' 
t0 = time.time() 
sqs = SearchQuerySet().models(Ringtone).filter(content=query_word)[:3] 
t1 = time.time() 
print sqs 
print t1 - t0 

結果是:

[<SearchResult: ringtones.ringtone (pk=u'1730')>, <SearchResult: ringtones.ringtone (pk=u'28959')>, <SearchResult: ringtones.ringtone (pk=u'25889')>] 
0.422543048859> 0.422543048859 

當我得到的所有搜索結果,代碼:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import sys 
sys.path.append('/home/guomeng/projects/tapplex_ringtones') 
import os 
os.environ['DJANGO_SETTINGS_MODULE'] = "tapplex_ringtones.settings" 

from haystack.query import SearchQuerySet 
from ringtones.models import Ringtone 
import time 

query_word = u'sky' 
t0 = time.time() 
sqs = SearchQuerySet().models(Ringtone).filter(content=query_word) 
t1 = time.time() 
print sqs 
print t1 - t0 

結果是:

[<SearchResult: ringtones.ringtone (pk=u'1730')>, <SearchResult: ringtones.ringtone (pk=u'28959')>, <SearchResult: ringtones.ringtone (pk=u'25889')>, <SearchResult: ringtones.ringtone (pk=u'5303')>, <SearchResult: ringtones.ringtone (pk=u'5335')>, <SearchResult: ringtones.ringtone (pk=u'5411')>, <SearchResult: ringtones.ringtone (pk=u'1212')>, <SearchResult: ringtones.ringtone (pk=u'28473')>, <SearchResult: ringtones.ringtone (pk=u'23867')>, <SearchResult: ringtones.ringtone (pk=u'27087')>, <SearchResult: ringtones.ringtone (pk=u'26849')>, <SearchResult: ringtones.ringtone (pk=u'2973')>, <SearchResult: ringtones.ringtone (pk=u'2645')>, <SearchResult: ringtones.ringtone (pk=u'31007')>, <SearchResult: ringtones.ringtone (pk=u'11637')>, <SearchResult: ringtones.ringtone (pk=u'16957')>, <SearchResult: ringtones.ringtone (pk=u'106')>, <SearchResult: ringtones.ringtone (pk=u'2481')>, <SearchResult: ringtones.ringtone (pk=u'15697')>] 
0.19460105896 

爲什麼我得到的所有結果是快?

+0

我是不熟悉haystack,但嘗試使用'from timeit import default_timer as timer''start = timer()''end = timer()'print(end-start)'並打印查詢,而不是結果print(sqs.query )'並且在這裏發佈查詢 – madzohan 2014-11-24 10:38:57

+0

,實際上如果你同時打印兩個查詢 - 你會發現在第二種情況下Django添加了'LIMIT'和'OFFSET'子句https://docs.djangoproject.com/zh/dev/topics/db/queries /#limits-querysets,http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down – madzohan 2014-11-24 10:53:50

回答

0

可能是因爲:

SearchQuerySet().models(Ringtone).filter(content=query_word)[:3] 

的任何事

SearchQuerySet().models(Ringtone).filter(content=query_word) 

呢,而且,更新查詢與限制條款中,並返回一個新的查詢集。這可以解釋全部或部分時間差異。爲了獲得有意義的結果,您需要平均多次調用所花費的時間,並分析一些內部代碼 - 即數據庫處理查詢需要多長時間,以及查詢實際上是什麼等。