Подтвердить что ты не робот

Функция поиска на многоязычном сайте django

Я создаю многоязычный сайт Django, и я использую django-transmeta для моих переводов данных модели. Теперь мне интересно, есть ли приложение поиска Django, которое работает с многоязычными моделями. Я играл с Haystack, и он отлично работает для одноязычных сайтов, но я не могу заставить его работать с метаклассами трансмета...

Есть ли у кого-нибудь опыт в этом? Любые указатели будут оценены!

веселит,

Мартина

4b9b3361

Ответ 1

Это скорее отправная точка, чем полное решение, но я надеюсь, что это поможет, и что другие пользователи может улучшить эту идею и достичь лучшего решения.

Использование 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')

Если вы хотите индексировать несколько полей, вы, очевидно, можете использовать шаблон. Только один из индексов может иметь документ = True.

Если вам требуется предварительное рендеринг http://haystacksearch.org/docs/searchindex_api.html, поле для более быстрый дисплей, вы должны создать его для каждого языка (т.е. rendered_en, rendered_pt)

2) Запрос правильного индекса

Метод auto_query по умолчанию haystack запрограммирован на получение параметра запроса "q" в запросе и найдите поле индекса содержимого, которое помечено как document = True - во всех моделях индекса. Только один из индексов может иметь документ = 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'),
)

Теперь ваш поиск должен знать выбранный язык.

Ответ 2

Я написал подробное объяснение о том, как это сделать: http://anthony-tresontani.github.com/Django/2012/09/20/multilingual-search/

Это подразумевает запись пользовательского движка solr (backend + query) и настройки нескольких ядер по языкам.

Ответ 3

Существует несколько коммерческих продуктов - например, многоязычный индексатор для Solr или Lucene, способный автоматически определять язык.

Мне не нравятся коммерческие продукты, но идея хорошая и простая - обход веб-сайта, определение языка (например, метатега) и индекса.

Итак, выберите поисковую систему и попробуйте расширить ее для обработки многоязычных сайтов.

Хороший вопрос, сообщите нам, как вы это решили.

Ответ 4

Вот решение.

Используйте Sphinx. Создайте индекс для каждого языкового стандарта. Например. Статьи-en_us, Статьи-es_mx и т.д.

Когда вы передаете поисковый запрос в spiinx search api, добавьте код локали к имени индекса.

Вот ссылка на как настроить sphinx с django.

Ответ 5

Избегайте сфинкса, если сможете, так как вам захочется меньше зависимостей. Я использую django для достижения multilingua с использованием параметра hl = languageCode, например hl = el для греческого или любого другого 39 языков или, таким образом, django с поддержкой appengine. gae инженеры будут обновлять бэкэнд независимо от моих обновлений, файлы .po с проектом gettext - это languagepack