使用Django + Celery更新Haystack搜索索引

knu*_*uck 30 python django indexing celery django-haystack

在我的Django项目中,我正在使用Celery.我将来自crontab的命令切换为周期性任务,但它运行良好,但它只是在模型上调用方法.是否可以从周期性任务更新我的Haystack索引?有没有人这样做过?

/manage.py update_index
Run Code Online (Sandbox Code Playgroud)

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

Jan*_*ann 30

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

from haystack.management.commands import update_index
update_index.Command().handle()
Run Code Online (Sandbox Code Playgroud)

  • 这很有效.你能解释为什么这比使用django.core.management.call_command("update_index")更好吗? (10认同)
  • 确保在某处"导入app.search_indexes",否则我找不到它.必须注册模型,否则将跳过它们. (2认同)

小智 12

对于haystack的2.0.0版测试版,此代码应该有效:

from haystack.management.commands import update_index
update_index.Command().handle(using='default')
Run Code Online (Sandbox Code Playgroud)

  • 从haystack 2.1.0开始,`using`接受后端列表.所以它应该是`handle(using = ['default'])` (5认同)
  • 在那里,您还可以使用"删除"选项删除不存在的条目.`update_index.Command().处理(使用= '默认',除去=真)` (4认同)

Ale*_*gov 7

此外,从haystack的第2版开始,你可以从python中调用rebuild index

from haystack.management.commands import update_index, rebuild_index
rebuild_index.Command().handle(interactive=False)
Run Code Online (Sandbox Code Playgroud)

如果您真的想要重建索引,那么" 互动 "会阻止干草堆问问题.这相当于--no-input命令行选项.

如果您使用xapian作为FTS后端,请记住索引的多线程更新将导致DB Write Lock.因此,使用celery-haystack包的解决方案会尝试将索引更新传播到多个worker(多个线程),从而导致使用xapian进行锁定.


Jam*_*son 6

https://github.com/django-haystack/celery-haystack

我觉得这个软件包是一个很棒的,简单的插件应用程序,通过芹菜提供干草堆索引.我在一些项目中使用它.