你如何加速 Haystack -搜索功能(使用 Whoosh 后端)分页 Django ListView ?
我有一个简单的 ListView,例如:
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_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 秒才能运行...
我尝试使用 django profiler , 但我没有看到更改前后的查询时间有太大差异,运行时间最长的查询只需要一秒钟,这表明 View 端存在一些错误,导致所有查询结果被迭代。
是什么导致 Haystack 运行得非常慢?
请您参考如下方法:
搜索速度慢的一个原因是,对于每个搜索结果,haystack 都会尝试从数据库中获取相应的对象。您可以使用 load_all() 来防止此行为在 SearchQuerySet 上。然后 haystack 将尝试在一次查询中收集所有结果。显示来自相关模型的内容时要小心,因为这会导致在没有任何额外配置的情况下进行额外的数据库查找。
如果您想避免一般的数据库查找和 only display data that is indexed (您也可以尝试这样做以确保缓慢是由额外的数据库查找引起的)。 否则,如果您需要额外调试,请使用 debug-toolbar ,它将显示所有数据库查询,并且还有一个额外的 haystack 面板。
