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:
- jak spis treści dla wszystkich językach
- 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.
+1 - Interesujące pytanie. –
+1 - ciekawe pytanie, interesuje odpowiedź – neuro