2010-12-05 6 views
28

Django 프로젝트에서 Celery를 사용하고 있습니다. 나는 crontab의 명령을주기적인 작업으로 바꾸었지만 잘 작동하지만 모델의 메서드를 호출하고있다. 정기적 인 작업에서 Haystack 인덱스를 업데이트 할 수 있습니까? 아무도이 짓을 한거야?Django + Celery로 덤불 검색 색인 업데이트

/manage.py update_index 

건초 더미 문서에서 색인을 업데이트하는 명령입니다. 그러나이를 작업에서 호출하는 방법을 모르겠습니다.

+0

관리 명령은 최적으로 공용 API를 감싸는 얇은 래퍼 여야하지만 슬프게도 여기서는 그렇지 않습니다. https://github.com/toastdriven/django-haystack/blob/master/haystack/management/commands/update_index.py – asksol

+2

해킹으로 django.core.management.call_command ("update_index")를 사용할 수 있지만 오히려 독립적으로 작동하도록 위에 링크 된 코드를 복사 + 붙여 넣기 – asksol

+0

@asksol, 답장을 보내 주셔서 감사합니다. call_command가 해킹으로 간주되는 이유는 무엇입니까? 복사가 전체 명령을 붙여 넣는 것이 더 간단 해 보입니다. – knuckfubuck

답변

29

아마 파이썬에서 직접 관리 명령어를 실행하고 작업 건초 더미의 버전 2.0.0 베타로

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

이 효과가 있습니다. django.core.management.call_command ("update_index")를 사용하는 것보다 이것이 왜 더 나은지 설명해 주시겠습니까? – knuckfubuck

+0

맞습니다. 제대로 작동해야합니다. 나는 그 기능에 대해 몰랐습니다. – Jann

+2

'import app.search_indexes'를 어딘가에 가져 오면 작동하지 않을 것입니다. 모델을 등록해야합니다. 그렇지 않으면 모델을 건너 뜁니다. –

11

에서 실행하는 것이 작업을 수행 할 수있는 가장 쉬운 방법이 코드는 작동합니다 :

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

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

존재하지 않는 항목을 제거하려면 '제거'옵션을 사용할 수도 있습니다. 'update_index.Command(). handle (사용 = 'default', remove = True)' – hurturk

+4

haystack 2.1.0부터,'using'은 백엔드 목록을 허용합니다. 그래서 그것은'handle (사용 = [ 'default'])' – temoto

6

나는이 패키지가 좋은, 쉽게 플러그인 응용 프로그램 셀러리를 통해 건초 더미 인덱싱을 제공하기로 찾을 수 있습니다. 나는 그것을 몇 가지 프로젝트에서 사용했다.

+0

우수해야합니다. 그것은 매력처럼 일했다 :) –

5

또한, 건초 더미의 버전이 있기 때문에 당신은

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

으로 파이썬에서 인덱스를 다시 호출 할 수 있습니다 어디 "대화 형"건초 더미 당신이 정말로 인덱스를 다시 작성하려면 질문을하지 않도록한다. 이는 --no-input 명령 행 옵션과 동일합니다.

xapian을 FTS 백엔드로 사용하는 경우 인덱스에 대한 다중 스레드 업데이트로 인해 DB 쓰기 잠금이 발생한다는 점을 기억하십시오. 따라서 celery-haystack 패키지의 솔루션은 인덱스 업데이트를 다중 작업자 (다중 스레드)에 전파하여 xapian을 사용하여 잠금을 시도합니다.