【问题标题】:Updating a Haystack search index with Django + Celery使用 Django + Celery 更新 Haystack 搜索索引
【发布时间】:2011-05-20 12:22:20
【问题描述】:

在我的 Django 项目中,我使用的是 Celery。我将 crontab 中的命令切换为定期任务,它运行良好,但它只是在模型上调用一个方法。是否也可以通过定期任务更新我的 Haystack 索引?有人做过吗?

/manage.py update_index

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

【问题讨论】:

  • 管理命令最好只是对公共 API 的一个薄包装,但遗憾的是这里似乎并非如此; github.com/toastdriven/django-haystack/blob/master/haystack/…
  • 作为 hack,你可以使用 django.core.management.call_command("update_index"),但我宁愿复制+粘贴上面链接的代码以独立工作
  • @asksol,感谢您的回复。为什么 call_command 被认为是 hack?复制粘贴整个命令似乎更简单。
  • 啊,不是整个命令。只是实际做索引的部分,没有 Django 命令的东西。

标签: python django indexing celery django-haystack


【解决方案1】:

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

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

【讨论】:

  • 这行得通。你能解释一下为什么这比使用 django.core.management.call_command("update_index") 更好吗?
  • 你说得对,应该也可以,我不知道那个功能:)
  • 确保在某处import app.search_indexes,否则我发现它不起作用。模型必须注册,否则将被跳过。
  • 你可以像这样传递命令参数:update_index.Command().handle(age=1)
  • @Neil 年龄=1 是什么意思 - 是 1 天还是一小时?如何传递日期?
【解决方案2】:

至于 haystack 2.0.0 beta 版,这段代码应该可以工作:

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

【讨论】:

  • 您还可以使用“删除”选项删除不存在的条目。 update_index.Command().handle(using='default',remove=True)
  • 从 haystack 2.1.0 开始,using 接受后端列表。所以应该是handle(using=['default'])
【解决方案3】:

另外,从 haystack 版本 2 开始,您可以从 python 调用重建索引

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

如果您真的想重建索引,“interactive”会阻止 haystack 提问。这相当于 --no-input 命令行选项。

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

【讨论】:

    【解决方案4】:

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

    我发现这个包是一个很棒的、简单的插件应用程序,可以通过 celery 提供 haystack 索引。我在几个项目中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2014-09-25
      • 2012-05-30
      • 2012-03-21
      • 2015-09-21
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多