функциональность поиска на многоязычном сайте django - PullRequest
25 голосов
/ 07 октября 2009

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

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

ура

1011 * мартин *

Ответы [ 5 ]

10 голосов
/ 15 октября 2009

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

Используя Haystack для индексации многоязычного сайта (используя django-transmeta или django-multilingual), вы сталкиваетесь с двумя проблемами:

  1. как проиндексировать контент для всех языки
  2. как искать запрос правильный индекс в зависимости от выбранные языки

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'),
)

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

1 голос
/ 21 сентября 2012

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

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

0 голосов
/ 13 октября 2009

Вот решение.

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

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

Вот ссылка на , как настроить sphinx с помощью django .

0 голосов
/ 15 октября 2009

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

0 голосов
/ 09 октября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...