2009-10-07 15 views
25

Buduję wielojęzyczną witrynę Django i używam django-transmeta do moich tłumaczeń danych modelowych. Teraz zastanawiam się, czy istnieje aplikacja do wyszukiwania Django, która działa z modelami wielojęzycznymi. Grałem z Haystack i działa dobrze dla witryn w jednym języku, ale nie mogę go uruchomić z metaclami transmeta ...funkcja wyszukiwania w wielojęzycznej witrynie django

Czy ktoś ma z tym jakieś doświadczenie? Wszelkie wskazówki będą mile widziane!

okrzyki,

martin

+2

+1 - Interesujące pytanie. –

+0

+1 - ciekawe pytanie, interesuje odpowiedź – neuro

Odpowiedz

10

to raczej punkt wyjścia niż pełne rozwiązanie, ale mam nadzieję, że to pomoże i że inni użytkownicy może poprawić ten pomysł i dotrzeć lepsze rozwiązanie.

Korzystanie Haystack do indeksu wielojęzyczną stronę (za pomocą Django Transmeta lub Django wielojęzyczna) twarz dwa problemy:

  1. jak spis treści dla wszystkich językach
  2. jak szukać zapytania prawidłowy wskaźnik zależności od wybranych językach

1) indeksować zawartości dla wszystkich języków

utworzyć oddzielne pola dla każdego języka w każdym modelu SearchIndex, wykorzystując wspólny przedrostek a także kod języka:

text_en = indexes.CharField(model_attr='body_en', document=True) 
text_pt = indexes.CharField(model_attr='body_pt') 

Jeśli chcesz indeksować kilku polach można oczywiście użyć szablonu. Tylko jeden z indeksów może mieć document = True.

Jeśli trzeba pre-renderowane http://haystacksearch.org/docs/searchindex_api.html pole dla szybszego wyświetlania, należy utworzyć dla każdego języka (tj rendered_en, rendered_pt)

2) odpytywanie prawidłowy indeks

Domyślna stogu siana Metoda auto_query jest zaprogramowana do odbierania parametru zapytania "q" na żądanie i przeszukiwania pola indeksu "treści" - tego oznaczonego jako dokument = True - we wszystkich modelach indeksów. Tylko jeden z indeksów może mieć document = True i wierzę, że możemy mieć tylko SearchIndex dla każdego modelu django.

Najprostszym rozwiązaniem, wykorzystując wspólny formularz wyszukiwarki, jest stworzenie wielojęzyczny SearchQuerySet że filtry oparte nie na treści, ale na tekstem_ (tekst będącego prefiks używany na modelu Searchindex powyżej)

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): 
     """Narrows the search based on certain attributes and the default operator.""" 
     if 'content' in kwargs: 
      kwd = kwargs.pop('content') 
      kwdkey = "text_%s" % str(get_language()) 
      kwargs[kwdkey] = kwd 
     if getattr(settings, 'HAYSTACK_DEFAULT_OPERATOR', DEFAULT_OPERATOR) == 'OR': 
      return self.filter_or(**kwargs) 
     else: 
      return self.filter_and(**kwargs) 

i wskazać swoje wyszukiwanie URL do widoku, który używa tego zestawu zapytanie:

from haystack.forms import ModelSearchForm 
from haystack.views import SearchView 

urlpatterns += patterns('haystack.views', 
    url(r'^search/$', SearchView(
     searchqueryset=MlSearchQuerySet(), 
     form_class=ModelSearchForm 
    ), name='haystack_search_ml'), 
) 

teraz wyszukiwanie powinni być świadomi wybranym języku.

+0

Podczas korzystania z funkcji autouzupełniania i korzystania z widoku: def search_autocomplete (request): sqs = SearchQuerySet(). Autouzupełnianie (content_auto = request.GET.get ('q', '')) [: 5] --------- Jak możemy przyjąć twoje rozwiązanie? – ratata

+0

Jak o: 1. Dodaj content_auto_ indeksy do klasy SearchIndex klasie 'SearchableIndex (indexes.SearchIndex, indexes.Indexable): content_auto_en = indexes.EdgeNgramField (model_attr = 'text_en') content_auto_ .. .' 2. Udostępnij autouzupełnianiu widok danego języka. W Django LocaleMiddleware użyj i18n_patterns; lub przekazać kod języka jako parametr w żądaniu ajax. 3. 'def search_autocomplete (wniosek) auto_key = "content_auto_% s" % get_language() kwargs = {auto_key: request.GET.get ('q' '')} SQS = SearchQuerySet() .autocomplete (** kwargs) [: 5] ' –

0

Istnieje kilka komercyjnych produktów - na przykład multilingual indexer dla Solr lub Lucene zdolnej do określenia języka automatycznie.

Nie lubię produktów komercyjnych, ale pomysł jest prosty i przyjemny - przeszukaj witrynę, określ język (np. Metatagiem) i indeks.

Wybierz więc wyszukiwarkę i spróbuj ją rozszerzyć, aby obsługiwała witryny wielojęzyczne.

Dobre pytanie, daj nam znać, jak to rozwiązałeś.

0

Oto rozwiązanie.

Użyj Sphinx. Utwórz indeks dla każdego locale. Na przykład. Artykuły-en_us, Artykuły-es_mx, itp.

Po przesłaniu zapytania do apiksu wyszukiwania sfinksa, dołącz kod lokalizacji do nazwy indeksu. To jest odniesienie na how to setup sphinx with django.

0

Unikaj sfinksa, jeśli możesz, ponieważ będziesz chciał mniej zależności. Używam django do osiągnięcia multilingua przy użyciu parametru hl = languageCode np. Hl = el dla języka greckiego lub dowolnych 39 języków lub tak django z appengine obsługuje. inżynierowie gae zaktualizuje backend bez względu na moje aktualizacje, pliki .po z projektem gettext Are My languagepack