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

Стоит отметить, что иногда вы предпочитаете неконфигурируемые «жестко закодированные» номера в вашем коде. Существует ряд известных , включая 0x5F3759DF, который используется в оптимизированном алгоритме обратного квадратного корня.

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

25
задан Hoff 7 October 2009 в 12:51
поделиться

5 ответов

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

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

  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 стога сена по умолчанию запрограммирован на получение параметра запроса «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'),
)

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

10
ответ дан 28 November 2019 в 22:00
поделиться

Вот решение.

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

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

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

0
ответ дан Palo Verde 16 October 2019 в 07:17
поделиться

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

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

1
ответ дан trez 16 October 2019 в 07:17
поделиться

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

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

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

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

0
ответ дан 28 November 2019 в 22:00
поделиться

Avoid sphinx if you can since you're going to want less dependencies. I use django to achieve multilingua using parameter hl=languageCode eg hl=el for greek or whatever 39 languages or so django with appengine supports. gae engineers will update backend no matter my updates, .po files with project gettext are my languagepack

0
ответ дан 28 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: