2013-03-12 56 views
2

我有兩個字段用於段落模型,其中一個是ManyToMany字段。使用SQS和相關數據(Haystack)

class Tag(models.Model): 
    tag = models.CharField(max_length=500) 
    def __unicode__(self): 
     return self.tag 
admin.site.register(Tag) 

class Paragraph(models.Model): 
    article = models.ForeignKey(Article) 
    text = models.TextField() 
    tags = models.ManyToManyField(Tag) 
    def __unicode__(self): 
     return "Headline: " + self.article.headline + " Tags: " + ', '.join([t.tag for t in self.tags.all()]) 
admin.site.register(Paragraph) 

我的.txt文件反映了指數的多對多關係tags-

{{object.text}} 
{% for tag in object.tags.all %} 
{{tag.tag}} 
{% endfor %} 

我views.py然後使用SQS搜索所有標籤(我要完成包括文字之前,這個第一字段)並檢索這些。所以在這種情況下,查詢是「政治」 -

def politics(request): 
    paragraphs = [] 
    sqs = SearchQuerySet().filter(tag="Politics") 
    paragraphs = [a.object for a in sqs[0:10]] 
    return render_to_response("search/home_politics.html",{"paragraphs":paragraphs},context_instance=RequestContext(request)) 

編輯: 和我search_indexes.py

class ParagraphIndex(indexes.SearchIndex, indexes.Indexable): 
    text= indexes.CharField(document=True, use_template=True) 
    tags= indexes.CharField(model_attr='tags') 
    def get_model(self): 
     return Paragraph 
    def index_queryset(self): 
     return self.get_model().objects 
    def load_all_queryset(self): 
     # Pull all objects related to the Paragraph in search results.                              
     return Paragraph.objects.all().select_related() 

然而,這並不retrive任何東西,即使少數幾款有是標籤「政治」。我在這裏錯過了什麼,或者我應該以另一種方式處理相關數據?我是Haystack的初學者,所以任何幫助將非常感激。提前致謝!

回答

3

所以這是一個非常有幫助我解決問題的useful article

基礎上的文章,這是我現在search_indexes.py的樣子:

class ParagraphIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    tags = indexes.MultiValueField() 

    def prepare_tags(self,object): 
     return [tag.tag for tag in object.tags.all()] 

    def get_model(self): 
     return Paragraph 

    def index_queryset(self): 
     return self.get_model().objects 

    def load_all_queryset(self): 
     # Pull all objects related to Paragraph in search results.                     
     return Paragraph.objects.all().select_related() 

,我的views.py:

def politics(request): 
    paragraphs = [] 
    sqs = SearchQuerySet().filter(tags='Politics') 
    paragraphs = [a.object for a in sqs[0:10]] 
    return render_to_response("search/home.html", 
      {"paragraphs":paragraphs}, 
      context_instance=RequestContext(request)) 

,我使用elasticsearch發動機。希望這可以幫助!