2014-11-24 37 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) 

呢,而且,更新查询与限制条款中,并返回一个新的查询集。这可以解释全部或部分时间差异。为了获得有意义的结果,您需要平均多次调用所花费的时间,并分析一些内部代码 - 即数据库处理查询需要多长时间,以及查询实际上是什么等。