2010-12-05 19 views
28

In meinem Django-Projekt verwende ich Sellerie. Ich habe einen Befehl von crontab auf eine periodische Aufgabe umgestellt und es funktioniert gut, aber es ruft nur eine Methode für ein Modell auf. Kann ich meinen Haystack-Index auch von einer periodischen Aufgabe aktualisieren? Hat jemand das getan?Einen Heuschober-Suchindex mit Django + Sellerie aktualisieren

/manage.py update_index 

, dass der Befehl ist, den Index aus der Heuhaufen Dokumentation zu aktualisieren, aber ich bin nicht sicher, wie das von einer Aufgabe nennen.

+0

Management-Befehle sollten eigentlich nur ein dünner Wrapper um eine öffentliche API sein, aber leider scheint es hier nicht der Fall zu sein; https://github.com/toastdriven/django-haystack/blob/master/haystack/management/commands/update_index.py – asksol

+2

als Hack können Sie django.core.management.call_command ("update_index") verwenden, aber ich würde Kopieren Sie einfach den Code, der oben verlinkt ist, um unabhängig zu arbeiten – asksol

+0

@asksol, Danke für die Antwort. Warum wird call_command als Hack betrachtet? Es scheint einfacher zu machen, dass die Kopie den ganzen Befehl einfügt. – knuckfubuck

Antwort

29

der einfachste Weg, dies zu tun wäre wahrscheinlich das Management Befehl direkt von Python zu laufen sein und es in Ihrer Aufgabe ausführen

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

das hat funktioniert. Können Sie erklären, warum dies besser ist als die Verwendung von django.core.management.call_command ("update_index")? – knuckfubuck

+0

Sie haben recht, das sollte genauso gut funktionieren, ich wusste nicht über diese Funktion :) – Jann

+2

Stellen Sie sicher, 'app.search_indexes' irgendwo zu importieren oder es wird nicht funktionieren, die ich gefunden habe. Die Modelle müssen registriert werden oder sie werden übersprungen. –

11

Wie für Version 2.0.0 Beta von Heuhaufen, sollte dieser Code funktionieren:

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

Dort können Sie auch die Option 'Entfernen' verwenden, um nicht vorhandene Einträge zu entfernen. 'update_index.Command(). handle (using = 'default', remove = True)' – hurturk

+4

Ab Heuhaufen 2.1.0 akzeptiert 'using' die Liste der Backends. Also sollte es 'handle (using = ['default'])' – temoto

6

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

ich finde das Paket eine große, einfache Plug-in-App sein Heuhaufen Indizierung über Sellerie bereitzustellen. Ich habe es in einigen Projekten verwendet.

+0

Excellent sein. Es hat wie ein Charme funktioniert :) –

5

Da auch die Version 2 des Heuhaufen können Sie Index von Python als

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

Wo die „interaktive“ würde verhindern Heuhaufen Frage stellt wieder aufbauen aufrufen, wenn Sie wirklich Index neu erstellen möchten. Dies entspricht der Befehlszeilenoption --no-input.

Wenn Sie xapian als FTS-Backend verwenden, denken Sie bitte daran, dass Multithread-Aktualisierungen zum Index zu DB Write Lock führen würden. Die Lösung mit dem Sellerie-Heuhaufen-Paket versucht also, die Indexaktualisierung auf mehrere Worker (mehrere Threads) zu verteilen, was zu einer Sperre mit xapian führt.

Verwandte Themen