2010-12-05 79 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鎖定。