Python 使用Django+更新Haystack搜索索引;芹菜

Python 使用Django+更新Haystack搜索索引;芹菜,python,django,indexing,celery,django-haystack,Python,Django,Indexing,Celery,Django Haystack,在我的Django项目中,我使用芹菜。我将crontab中的一个命令转换为一个周期性任务,它工作得很好,但它只是在模型上调用一个方法。是否也可以从定期任务更新我的Haystack索引?有人这样做过吗 /manage.py update_index 这是从Haystack文档中更新索引的命令,但我不知道如何从任务中调用它。最简单的方法可能是直接从python运行管理命令,并在任务中运行它 from haystack.management.commands import update_index

在我的Django项目中,我使用芹菜。我将crontab中的一个命令转换为一个周期性任务,它工作得很好,但它只是在模型上调用一个方法。是否也可以从定期任务更新我的Haystack索引?有人这样做过吗

/manage.py update_index

这是从Haystack文档中更新索引的命令,但我不知道如何从任务中调用它。

最简单的方法可能是直接从python运行管理命令,并在任务中运行它

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

对于haystack的2.0.0 beta版,此代码应该可以工作:

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


我发现这个软件包是一个很好的,简单的插件程序,可以通过芹菜提供草垛索引。我在一些项目中使用了它。

此外,由于haystack的第2版,您可以将python中的重建索引称为

from haystack.management.commands import update_index, rebuild_index
rebuild_index.Command().handle(interactive=False)
其中“交互式””将阻止haystack询问您是否真的要重建索引。这相当于--无输入命令行选项


如果您使用xapian作为FTS后端,请记住对索引的多线程更新将导致DB写锁定。因此,芹菜haystack包的解决方案确实试图将索引更新扩展到多个工作线程(多线程),从而导致xapian锁定

管理命令最好只是一个公共API的薄包装器,但遗憾的是,这里的情况似乎并非如此;作为黑客,您可以使用django.core.management.call_命令(“update_index”),但我更愿意复制并粘贴上面链接的代码来工作independently@asksol,谢谢你的回复。为什么call_命令被认为是黑客?复制粘贴整个命令似乎更简单。啊,不是整个命令。只是实际执行索引的部分,没有Django命令的东西。这很有效。你能解释一下为什么这比使用django.core.management.call_命令(“update_index”)更好吗?你说得对,这应该也能用,我不知道这个函数:)确保
导入应用程序。搜索索引
,否则我找不到它。模型必须注册,否则将被跳过。您可以传递如下命令参数:
update\u index.command().handle(age=1)
@Neil age=1是什么意思?这是一天还是一小时?如何从中传递日期?您还可以使用“删除”选项删除不存在的条目
update_index.Command().handle(使用class='default',remove=True)
从haystack 2.1.0开始,使用
接受后端列表。所以它应该是
handle(使用=['default'])