9 августа 2011 г.

Обновили сайт

Сегодня мы немного обновили сайт студии. На главной появилась ссылка на наши разработки с открытым исходным кодом на гитхабе. Сейчас там несколько форков приложений для django, плагин для анимации спрайтов на jquery и репозиторий для DjangoDash 2011. О двух последних подробнее в следующий раз. На всех наших новых проектах мы используем Django, верстаем как завещал великий БЭМ, применяя возможности современных браузеров, известные под термином HTML5. Теперь об этом свидетельствуют ссылочки в подвале главной. С большим опозданием, но всё же обновился раздел Команда, свои заслуженные места обрели Рома и Виталий.
Появился раздел вакансии, мы всегда ищем энергичных и опытных укротителей питонов. Приходите к нам, у нас интересно.

1 августа 2011 г.

Поиск в Django с помощью Sphinx

Для интеграции Sphinx (движка для полнотекстового поиска) и Django существует приложение django-sphinx.

Это приложение автоматически генерирует конфигурационный файл (на основе которого строятся поисковые индексы), позволяет делать полнотекстовый поиск по моделям или по нескольким индексам одновременно (получая queryset-подобные объекты).

Управление свойствами индексов, весами атрибутов и тому подобным ведётся прямо из модели:

class MyModel(models.Model):
   ...
   search = SphinxSearch(weights={ 'name': 100, 'description': 10, 'tags': 80}, mode='SPH_MATCH_ALL', rankmode='SPH_RANK_NONE')
   ...
 

На основе этих данных manage-команда ./manage.py generate_sphinx_config составляет конфигурацию индексов.

К сожалению, проект развивается автором не очень интенсивно, но на github.com существует некоторое количество форков, решающих ряд проблем, среди которых изменившиеся в Django 1.3 настройки баз данных (поддержка нескольких БД) и поиск по нескольким индексам.

Для того, чтобы поиск одновременно по нескольким индексам позволял оперировать с результатами как с ORM-объектами, а не идентификаторами записей, необходимо проследить, чтобы выполнялись следующие два условия:

  1. В запросах, на основе которых строятся индексы (sql_query в секциях source конфига), в секции SELECT должно присутствовать <число> AS content_type, то есть должна быть связь с типом контента (для того, чтобы django-sphinx смог понять, какой модели принадлежит результат).
  2. В той же секции должно присутствовать объявление sql_attr_uint = content_type.
После этого запросы SphinxQuerySet(index='индекс1 индекс2 индекс3').query('поисковая фраза') будут возвращать списки ORM-объектов.


Наш форк django-sphinx можно найти тут