Skip to main content
 首页 » 编程设计

python之使用 Haystack 的 Django ListView 非常慢

2024年08月29日27zhenyulu

你如何加速 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 面板。