2014-12-24 3 views
0

Django Haystack을 사용하고 있습니다. 다음은 내 코드입니다 :Django Haystack에서 준비한 필드 검색 인덱스

settings.py

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 
     'URL': 'http://127.0.0.1:9200/', 
     'INDEX_NAME': 'haystack', 
    }, 
} 

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 

search_indexes.py 당신은 내가 RealtimeSignalProcessor이 포스트 인스턴스 생성 또는 업데이트에 대한 인덱스를 만들기 위해 사용시피

class PostIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    owner = indexes.CharField(model_attr='owner') 
    image_url = indexes.CharField() 

    def get_model(self): 
     return Post 

    def prepare_image_url(self, obj): 
     # Get first images for resulted search objects 
     return [image.image_main_page.url for image in obj.images.order_by('id')[:1]] 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

. 실제로 prepare 메소드를 사용하는 image_url 필드를 제외하고는 생성시 인스턴스를 색인화합니다. 인스턴스 업데이트시 색인이 생성되었습니다.

질문은 생성시 색인이 생성되지 않는 이유는 무엇입니까?

모든 포인터가 감사하겠습니다.

답변

2

나는과 같이 사용자 정의 신호 처리기 결국 :

class RelatedRealtimeSignalProcessor(RealtimeSignalProcessor): 
""" 
Extension to haystack's RealtimeSignalProcessor not only causing the 
search_index to update on saved model, but also for image url, which is needed to show 
images on search results 
""" 

def handle_save(self, sender, instance, **kwargs): 
    if hasattr(instance, 'reindex_related'): 
     for related in instance.reindex_related: 
      related_obj = getattr(instance, related) 
      self.handle_save(related_obj.__class__, related_obj) 
    return super(RelatedRealtimeSignalProcessor, self).handle_save(sender, instance, **kwargs) 

def handle_delete(self, sender, instance, **kwargs): 
    if hasattr(instance, 'reindex_related'): 
     for related in instance.reindex_related: 
      related_obj = getattr(instance, related) 
      self.handle_delete(related_obj.__class__, related_obj) 
    return super(RelatedRealtimeSignalProcessor, self).handle_delete(sender, instance, **kwargs) 

그리고 설정에서 지적 :

HAYSTACK_SIGNAL_PROCESSOR = 'your_app.signals.RelatedRealtimeSignalProcessor'