Fork of django-sphinx
В процессе работы над проектом (см. мой предыдущий пост для введения в тему) с использованием приложения django-sphinx, последний пришлось доработать до наших потребностей. Представляю мой fork от django-sphinx, в котором появились следующие возможности:
- возможность фильтровать или исключать из фильтрации по первичному ключу (pk)
- в метод
set_options добавлен параметр only_sphinx, которая возвращает результат запроса из Sphinx не делая запроса в БД
- добавлен метод only - обертка над одноименным методом django queryset
- добавлен метод group_distinct позволяющий подсчитывать кол-во уникальных значений по любому аттрибуту внутри группы
- в метод set_options добавлен параметр limit, позволяющий ограничить кол-во возвращаемых строк
- подправлена генерация конфига Sphinx при использовании свойства DATABASES в settings.py, начиная с версии Django 1.2 и больше
- добавлено свойство count к каждой строке результатов поиска - хранит кол-во записей в группе при использовании группировки
Интересные дополнительные возможности Sphinx
- Можно группировать по MVA атрибутам (см. предыдущий пост), то есть такой код вполне работает:
Tag.search.group_by('types', SPH_GROUPBY_ATTR)
- Можно подсчитывать кол-во уникальных значений по какому-то атрибуту внутри группы:
Tag.search.group_by('types', SPH_GROUPBY_ATTR).group_distinct('status')
- Интересные возможости по формированию строки поиска в расширенном режиме. Можно писать так:
Tag.search.query('(белая кошка) | собака | ёжик').\
set_options(mode='SPH_MATCH_EXTENDED2', rankmode="SPH_RANK_BM25", sort='SPH_SORT_RELEVANCE')
- По умолчанию Sphinx ищет по словам целиком с учетом морфологии указанного языка (русский, английский и т.д.). Но можно указать искать по вхождениям строк так:
Tag.search.query('соба*'). Чтобы это заработало в sphinx.conf в разделе index application_tag нужно прописать следующие строки (начинать поиск начиная с 3 символов):
enable_star = 1
min_prefix_len = 0
min_infix_len = 3