Python Django ListView使用Haystack时速度非常慢
如何加快搜索引擎(使用Whoosh后端)分页的Django列表视图 我有一个简单的列表视图,如:Python Django ListView使用Haystack时速度非常慢,python,django,django-haystack,Python,Django,Django Haystack,如何加快搜索引擎(使用Whoosh后端)分页的Django列表视图 我有一个简单的列表视图,如: class PersonListView(ListView) template_name = 'person-list.html' paginated_by = 10 def get_queryset(self): return Person.objects.all() 在我的本地主机上,返回一个包含3000个结果的页面大约需要1秒的时间 然后,我“插入”H
class PersonListView(ListView)
template_name = 'person-list.html'
paginated_by = 10
def get_queryset(self):
return Person.objects.all()
在我的本地主机上,返回一个包含3000个结果的页面大约需要1秒的时间
然后,我“插入”Haystack,通过执行以下操作允许对姓名进行全文搜索:
class PersonListView(ListView)
template_name = 'person-list.html'
paginated_by = 10
def get_queryset(self):
#return Person.objects.all()
return SearchQuerySet().models(models.Person)
我设置了相应的索引并运行manage.py rebuild\u index
:
class PersonIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
nickname = indexes.CharField()
first_name = indexes.CharField()
middle_name = indexes.CharField()
last_name = indexes.CharField()
def get_model(self):
return models.Person
def index_queryset(self, using=None):
return self.get_model().objects.all()
然而,在此之后,同样的页面现在需要大约15秒才能运行
我尝试使用,但我没有看到更改前后的查询时间有多大差异,运行时间最长的查询只需一秒钟,这表明视图端存在导致所有查询结果被迭代的错误
是什么导致Haystack运行得非常慢?搜索速度慢的一个原因是,对于每个搜索结果,Haystack都会尝试从数据库中获取相应的对象。您可以通过在
SearchQuerySet
上使用来防止这种行为。然后haystack将尝试在一个查询中收集所有结果。只是在显示来自相关模型的内容时要小心,因为这会在没有任何额外配置的情况下导致额外的数据库查找
如果您希望避免一般的数据库查找,并且(您也可以尝试这样做,以确保缓慢是由额外的数据库查找引起的)。
否则,如果需要额外的调试,请使用,它将显示所有数据库查询,并且还有一个额外的haystack面板 第一个选项,您可以在设置中将
包含拼写设置为False
,如下所示:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(PATH_TMP, "whoosh_index", "default"),
'STORAGE': 'file',
'POST_LIMIT': 128 * 1024 * 1024,
'INCLUDE_SPELLING': False,
'BATCH_SIZE': 100,
},
}
另一件事是,您可以将HAYSTACK\u ITERATOR\u LOAD\u PER\u QUERY
设置为更大的数字,例如,100
,而不是默认的10
HAYSTACK_ITERATOR_LOAD_PER_QUERY = 100
@你能不能也提供一些模板代码,让我们看看你是如何输出的?