2013-05-17 112 views
4

有沒有人用乾草堆使用Django taggit?我們如何通過乾草堆使標籤字段可索引?Django Haystack和Taggit

我曾嘗試:

class EventIndex(indexes.SearchIndex, indexes.Indexable): 
     text = indexes.CharField(model_attr='descr_en', document=True, use_template=True) 
     text_tr = indexes.CharField(model_attr='descr_tr') 
     tags = indexes.MultiValueField() 

     def prepare_text(self, obj): 
      return '%s %s' % (obj.title_en, obj.descr_en) 

     def prepare_text_tr(self, obj): 
      return '%s %s' % (obj.title_tr, obj.descr_tr) 

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

     def get_model(self): 
      return Event 

,我使用了多語種搜索的自定義searchqueryset:

class MlSearchQuerySet(SearchQuerySet): 
    def filter(self, **kwargs): 
     """Narrows the search based on certain attributes and the default operator.""" 
     if 'content' in kwargs: 
      kwd = kwargs.pop('content') 
      currentLngCode = str(get_language()) 
      lngCode = settings.LANGUAGE_CODE 
      if currentLngCode == lngCode: 
       kwdkey = "text" 
       kwargs[kwdkey] = kwd 
      else: 
       kwdkey = "text_%s" % currentLngCode 
       kwargs[kwdkey] = kwd 


     if getattr(settings, 'HAYSTACK_DEFAULT_OPERATOR', DEFAULT_OPERATOR) == 'OR': 
      return self.filter_or(**kwargs) 
     else: 
      return self.filter_and(**kwargs) 

回答

7

爲了讓標籤成爲我們增加了他們對我們的內容模板文件,例如搜索索引

{{ object.title }} 
{{ object.body }} 
{% for tag in object.tags.all %} {{ tag.name }} {% endfor %} 
{{ object.user.get_full_name }} 

我們還將其作爲MultiValueField

tags = indexes.MultiValueField() 

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

在這兩種情況下都沒有成功地嘗試進行提升工作,但是搜索必須正確地爲它們編制索引。

+0

我已更新我的問題,以更好地表示我的真實代碼結構。因爲我沒有使用您建議的方式獲取任何與標籤相關的搜索結果... – ratata

+0

您能否包含您的文本模板?如果你的標籤在那裏,他們應該被索引,他們將被視爲與你的模板中的任何其他內容相同。 –

+0

in'event_text.txt'我有:{{object.title}} {{object.descr}} {%for object in object.tags.all%} {{tag.name}} {%endfor%} – ratata