Django + Sphinx + Debian

Ставим отсюда

https://github.com/FactorAG/django-sphinx

В settings.py

INSTALLED_APS= (
...
'djangosphinx',
...
)
# Sphinx 2.0.4/2.0.6/2.0.8
SPHINX_API_VERSION = 0x119

models.py

from djangosphinx.models import SphinxSearch
class Product(models.Model):
    brand = models.ForeignKey(Brand, verbose_name=u'Бренд')
    title = models.CharField(_(u'Марка'), max_length=50, blank=True)
    caption = models.CharField(_(u'Серия'), max_length=150, blank=True)
    composition = models.CharField(_(u'Ингредиенты'), max_length=60, blank=True, null=True)
    about = RichTextField(_(u'Описание'), blank=True)
    pub_date = models.DateTimeField(default=datetime.now)
    pet = models.ManyToManyField(Pet, verbose_name=u'Животное')
    updated = models.DateTimeField(auto_now=True)
    search = SphinxSearch(weights={'title': 90, 'caption': 80, 'about': 100, 'composition': 70},
                          mode='SPH_MATCH_ALL', rankmode="SPH_RANK_BM25", sort='SPH_SORT_RELEVANCE',
                          )

views.py

@render_to('core/entry_list.html')
def searcher(request):
    if 'srch' in request.GET and request.GET['srch']:
        txt = request.GET['srch']
        entries = Product.search.query(txt)
        return {'object_list': entries, }
    else:
        return root(request)

django-sphinx умеет создавать конфигурацию для Sphinx

./manage.py generate_sphinx_config <app_name> > config/sphinx.conf

Получившийся файл конфигурации нужно немного дополнить

source core_product
{
    type                = mysql
    sql_host            =
    sql_user            = <DB_user>
    sql_pass            = ******
    sql_db              = <DB>
    sql_port            =
    sql_query_pre       = SET NAMES utf8
    sql_query_post      =
    sql_query           = \
        SELECT id, onmain, brand_id, title, caption, gen_caption, composition, about, ext, pub_date, updated\
        FROM core_product
    sql_query_info      = SELECT * FROM `core_product` WHERE `id` = $id
    # ForeignKey's
    sql_attr_uint       = brand_id
    # DateField's and DateTimeField's
    sql_attr_timestamp   = pub_date
    sql_attr_timestamp   = updated
}
index core_product
{
    source          = core_product
    path            = /home/project/var/sphinx
    docinfo         = extern
    morphology      = stem_enru, Soundex, Metaphone
    charset_type    = utf-8
    min_word_len    = 2
    min_infix_len   = 2
    min_prefix_len  = 0
    enable_star     = 1
    charset_table = 0..9, A..Z->a..z, _, a..z, U+0401->U+0435, U+0451->U+0435, U+410..U+42F->U+430..U+44F, U+430..U+44F
    index_exact_words = 1
    expand_keywords   = 1
    index_sp=1
    html_index_attrs = img=alt,title; a=title;
    html_strip=1
}
indexer {
    mem_limit = 64M
}
searchd {
    listen = 9312
    listen = 9306:mysql41
    log = /home/project/logs/searchd.log
    query_log = /project/logs/query.log
    read_timeout = 5
    client_timeout = 300
    max_children = 30
    pid_file = /home/project/tmp/searchd.pid
    max_matches = 1000
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old = 1
    mva_updates_pool = 1M
    max_packet_size = 8M
    max_filters = 256
    max_filter_values = 4096
    max_batch_queries = 32
    workers = threads
}

Стваим Sphinx

  • Качаем исходники (есть готовые пакеты) отсюда
    http://sphinxsearch.com/downloads/release/
  • Распаковываем и конфигурируем
    tar xzvf sphinx-2.0.8-release.tar.gz
    sphinx-2.0.8-release
    ./configure --with-mysql
    make
  • Осталось собрать пакет и установить его в ситему (никогда не делайте make install, каждый раз, когда вы так делаете, умирает котенок)
    aptitude install checkinstall
    checkinstall

    теперь вы можете управлять пакетом с помощью пакетного менеджера.

Sphinx установлен, осталось проиндексировать БД и запустить демона.

indexer --config config/sphinx.conf --all

Для дальнейшей индексации можно использовать

indexer --config config/sphinx.conf --all --rotate

Для запуска

searchd -c config/sphinx.conf

Для остановки

searchd --stop -c config/sphinx.conf

Для повышения качества поиска можно использовать словарь словоформ

aptitude install myspell-ru
spelldump /usr/share/hunspell/ru_RU.dic /usr/share/hunspell/ru_RU.aff wordforms_ru_RU.txt
cat wordforms_ru_RU.txt | enca -L ru
iconv -f KOI8-R -t UTF-8 -o wordforms_ru_RU_UTF8.txt wordforms_ru_RU.txt

Затем подключаем его в sphinx.conf в раздел index

wordforms = /path/to/wordforms_ru_RU_UTF8.txt

Источники
http://sphinxsearch.com/docs/manual-2.0.8.html#supported-system

http://osmanov-dev-notes.blogspot.ru/2011/06/how-to-create-sphinx-wordform.html

http://proft.me/2011/01/22/polnotekstovyj-poisk-v-django/

http://habrahabr.ru/post/136261/

http://habrahabr.ru/post/147745/

http://habrahabr.ru/post/132118/

Добавить комментарий

Ваш адрес email не будет опубликован.