我正在将 Django 与 haystack 结合使用,我想知道是否可以打印搜索显示结果所需的时间。例如:
每次查询后我想打印:x results in y秒
。
这真的可以用 haystack 实现吗?预先感谢您!
最佳答案
Haystack 默认将搜索函数包装在一个包装器中,该包装器对搜索进行计时并输出(请参阅 source code )。但是,只有当DEBUG
为True
时,它才会输出信息。
您可以做的是指定一个类似的包装器来输出时间并将其动态添加到搜索后端。请注意,您需要包装您正在使用的特定后端的方法。例如。如果您使用 ElasticSearch:
from time import time
from haystack.backends.elasticsearch_backend import ElasticsearchSearchBackend
def time_wrapper(func):
def wrapper(*args, **kwargs):
start = time()
try:
return func(*args, **kwargs)
finally:
stop = time()
# time = stop - start, now output it wherever you want.
print '%.3f' % (stop - start)
return wrapper
ElasticsearchSearchBackend.search = time_wrapper(ElasticsearchSearchBackend.search)
您可以在更高级别上对搜索进行计时,包括构建查询所需的时间等,但请记住 SearchQuerySet
是惰性的。您需要计算查询集的第一次评估的时间,而不是构建的时间。
如果您想向用户显示所花费的时间,请考虑对实际 View 函数(的一部分)进行计时,并将其传递到模板上下文。
关于Django 1.6,干草堆 : How to print the search's time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239439/