Это скорее отправная точка, чем полное решение, но я надеюсь, что это поможет и другим пользователям.
может улучшить эту идею и найти лучшее решение.
Используя Haystack для индексации многоязычного сайта (используя django-transmeta или django-multilingual), вы сталкиваетесь с двумя проблемами:
- как проиндексировать контент для всех
языки
- как искать запрос
правильный индекс в зависимости от
выбранные языки
1) Индексировать содержание для всех языков
Создать отдельные поля для каждого языка в каждой модели SearchIndex, используя общий префикс
и код языка:
text_en = indexes.CharField(model_attr='body_en', document=True)
text_pt = indexes.CharField(model_attr='body_pt')
Если вы хотите проиндексировать несколько полей, вы, очевидно, можете использовать шаблон. Только один из индексов может иметь document = True.
Если вам нужно предварительно обработанное поле http://haystacksearch.org/docs/searchindex_api.html для
Для более быстрого отображения вы должны создать по одному для каждого языка (например, rendered_en, rendered_pt)
2) Запрос правильного индекса
Метод auto_query haystack по умолчанию запрограммирован на получение параметра запроса "q" по запросу.
и искать в поле индекса «содержимого» - поле, помеченное как document = True - во всех моделях индекса.
Только один из индексов может иметь document = True, и я считаю, что у нас может быть только SearchIndex.
для каждой модели Django.
Самое простое решение, использующее общую форму поиска, состоит в создании многоязычного SearchQuerySet
этот фильтр основан не на содержимом, а на тексте (текст, являющийся префиксом, используемым в
модель Searchindex выше)
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)
и укажите поисковый URL для просмотра, который использует этот набор запросов:
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'),
)
Теперь ваш поиск должен знать выбранный язык.