Стоит отметить, что иногда вы предпочитаете неконфигурируемые «жестко закодированные» номера в вашем коде. Существует ряд известных , включая 0x5F3759DF, который используется в оптимизированном алгоритме обратного квадратного корня.
В редких случаях, когда я нахожу необходимость использовать такие магические числа, я устанавливаю их как const в своем коде и документирую, почему они используются, как они работают и откуда они пришли.
Это скорее отправная точка, чем полное решение, но я надеюсь, что это поможет и другим пользователям могут улучшить эту идею и найти лучшее решение.
Используя Haystack для индексации многоязычного сайта (используя django-transmeta или django-multingual), вы сталкиваетесь с двумя проблемами:
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'),
)
Теперь ваш поиск должен учитывать выбранный язык.
Вот решение.
Используйте Сфинкс . Создайте индекс для каждой локали. Например. Articles-en_us, Articles-es_mx и т. Д.
Когда вы передаете поисковый запрос в API поиска sphinx, добавьте код локали к имени индекса.
Вот ссылка на , как настроить сфинкса с помощью django .
Я написал подробное объяснение о том, как это сделать, здесь: http://anthony-tresontani.github.com/Django/2012/09/20/multilingual-search/
Это подразумевает написание собственного механизма solr (backend + query) и настройку нескольких ядер по языкам.
Есть несколько коммерческих продуктов - например, многоязычный индексатор для Solr или Lucene , способный определять язык автоматически.
Мне не нравятся коммерческие продукты, но идея хороша и проста - сканировать веб-сайт, определять язык (например, с помощью метатега) и индексировать.
Так что выберите поисковую систему и попробуйте расширить ее для поддержки многоязычных сайты.
Хороший вопрос, дайте нам знать, как вы его решили.
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