Python Django ListView使用Haystack时速度非常慢

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

如何加快搜索引擎(使用Whoosh后端)分页的Django列表视图

我有一个简单的列表视图,如:

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

@你能不能也提供一些模板代码,让我们看看你是如何输出的?