2013-04-06 3 views
1

내 django 프로젝트에서 whoose backend와 함께 haystack을 사용하고 있습니다. 그리고 내 모델은 modeltranslation 모듈과 다국어입니다, 그것은 제목이라는 필드에 대한 title_tr, title_en 같은 자동 필드를 만듭니다 ...Django Haystack Whoosh 다국어 사이트

그물을 검색하고 아래 라인을 작성 선택한 언어를 인식하도록 노력하고 있지만 그것은 title_tr 작동하지 않습니다, entry_tags_tr 필드 ... #은

from haystack import indexes 
from aksak.blog.models import Entry 

class EntryIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(model_attr='descr_en', document=True, use_template=True) 
    text_tr = indexes.CharField(model_attr='descr_tr') 
    title_en = indexes.CharField(model_attr='title_en') 
    title_tr = indexes.CharField(model_attr='title_tr') 
    tags = indexes.MultiValueField(indexed=True, stored=True, model_attr='entry_tags') 

    def get_model(self): 
     return Entry 


    # haystackCustomQuery.py !!! IN URLS.PY I AM USING THIS CUSTOM VIEW <------------- 

    from django.conf import settings 
    from django.utils.translation import get_language 
    from haystack.query import SearchQuerySet, DEFAULT_OPERATOR 

    class MlSearchQuerySet(SearchQuerySet): 
     def filter(self, **kwargs): 
      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) 

답변

3

확실하지 search_indexes.py,하지만 난 제대로 해결되지 귀하의 SearchIndex 서브 클래스의 model_attr 매개 변수에 관련이있을 수 있다고 생각 건초 더미. 대신 prepare_<index_fieldname> 메소드를 정의하십시오.

나는 (독일/영어) 프로젝트에서 사용한 것에 대한 전체 예제를 포함하고 있습니다. 그냥 당신과 영감을 search functionality on multi-language django site에 의해처럼, 나는 현재 언어를 가지고와 SearchIndex 필드에 매핑 : 본질에서

from django.conf import settings 
from modeltranslation.utils import get_language 
from modeltranslation.settings import DEFAULT_LANGUAGE 
from haystack.query import SearchQuerySet, DEFAULT_OPERATOR 

class ModeltranslationSearchQuerySet(SearchQuerySet): 
    def filter(self, **kwargs): 
     if 'content' in kwargs: 
      kwd = kwargs.pop('content') 
      lang = get_language() 
      if lang != DEFAULT_LANGUAGE: 
       kwdkey = "text_%s" % lang 
       kwargs[kwdkey] = kwd 
      else: 
       kwargs['text'] = kwd 
     if getattr(settings, 'HAYSTACK_DEFAULT_OPERATOR', DEFAULT_OPERATOR) == 'OR': 
      return self.filter_or(**kwargs) 
     else: 
      return self.filter_and(**kwargs) 

가 자신의 prepare_<index_fieldname> 방법으로 언어 당 하나 개의 SearchIndex 필드, 각이있다. 이 대회는 여기 textdocument=True와 인덱스 필드 text_de보다는 사용된다는 것을,

from haystack import indexes 

class ContentIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True) # German (default language) 
    text_en = indexes.EdgeNgramField() # English 

    def prepare_text(self, obj): 
     return '%s %s' % (obj.title_de, obj.descr_de) 

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

주 : 정말 일반적인 아니지만, 내 간단한 요구 사항에 잘 작동 - 여기 내 search_indexes.py의 버전을 박탈이다 건초 더미의 (당신은 그 권리를 얻었다). 그러나 prepare_<index_fieldname> 메서드에는 실제 변환 필드 이름이 사용됩니다. 또한 템플릿을 사용하지 않고 간단한 문자열 연결을 사용합니다.

는 는 건초 더미에 포함 된 일반적인 SearchView은 (내가 2.0.0 베타를 사용)를 searchquery 매개 변수를

, 그래서 (난 당신이 있음이 이해까지)에 ModeltranslationSearchQuerySet는 설정과 같이 URL을 통해 직접 전달 될 수

from haystack.forms import ModelSearchForm 

url(r'^search/$', SearchView(
    searchqueryset=ModeltranslationSearchQuerySet(), form_class=ModelSearchForm)) 

최종주의 사항 : 나는 잠시 후에 해당 코드를 사용하지 않았으며 modeltranslation은 현재 언어 인식에 대한 몇 가지 주요 변경 사항을 가지고있었습니다. modeltranslation> = 0.6에서 약간 단순화 될 수 있습니다.

+0

안녕하세요, hystack은 내 예제에서 'text_en'속성이 없습니다 ... – ratata

+0

''prepare_'' 메소드에서 실제 모델 필드 이름을 사용 했습니까? 나는 당신의''descr'' 필드 이름을 사용하기 위해 나의 예제를 업데이트했다. –

+0

감사합니다. 지금 작동하고 있습니다. 하나의 작은 질문도 있습니다 ... 내 search_indexes.py에 'tags = indexes.MultiValueField (색인 된 = True, 저장된 = True, model_attr ='entry_tags ')'가 있습니다. 내 진입 모델의 tagfield. 나는 그것을 준비 메서드로 추가하려고했지만 오류가 발생했습니다 -> TypeError : 문자열 서식을 지정할 때 모든 인수가 변환되지 않았습니다. – ratata