2010-12-05 80 views
28

在我的Django项目中,我使用了芹菜。我从crontab切换一个命令是一个周期性任务,它运行良好,但它只是调用一个模型的方法。是否有可能从定期任务中更新Haystack索引?有没有人做过这个?使用Django + Celery更新Haystack搜索索引

/manage.py update_index 

这是从Haystack文档更新索引的命令,但我不确定如何从任务调用该命令。

+0

管理命令最好只是一个公共API的简单封装,但遗憾的是,在这里似乎并不是这样; https://github.com/toastdriven/django-haystack/blob/master/haystack/management/commands/update_index.py – asksol 2010-12-05 12:47:52

+2

作为黑客你可以使用django.core.management.call_command(“update_index”),但我会而是复制+粘贴上面链接的代码以独立工作 – asksol 2010-12-05 12:49:04

+0

@asksol,感谢您的回复。为什么call_command被认为是黑客?做这个复制粘贴整个命令似乎更简单。 – knuckfubuck 2010-12-06 04:37:28

回答

29

这样做很可能是直接从蟒蛇运行管理命令,并在你的任务

from haystack.management.commands import update_index 
update_index.Command().handle() 
11

至于版本2.0.0测试版草垛运行它的最简单的方法,该代码应工作:

from haystack.management.commands import update_index 
update_index.Command().handle(using='default') 
5

而且,因为草堆的2版本,你可以调用从蟒蛇重建索引

from haystack.management.commands import update_index, rebuild_index 
rebuild_index.Command().handle(interactive=False) 

凡“互动”会阻止草堆问的问题,如果你真的想重建索引。这相当于--no-input命令行选项。

如果您使用xapian作为FTS后端,请记住对索引进行多线程更新会导致DB写入锁定。因此,使用celery-haystack包的解决方案确实试图将索引更新传播到多个工作者(多线程),从而导致xapian锁定。