FAQ Установка Sphinx на примере FreeBSD

Mikotka

Пользователь
Что такое Сфинкс?

Sphinx (

Please Login or Register to view hidden text.

SQL Phrase Index) — система

Please Login or Register to view hidden text.

, разработанная Андреем Аксеновым и распространяемая по лицензии

Please Login or Register to view hidden text.

. Отличительной особенностью является высокая скорость индексации и поиска, а так же интеграция с существующими СУБД (

Please Login or Register to view hidden text.

,

Please Login or Register to view hidden text.

) и API для распространённых языков веб-програмирования (официально поддерживаются

Please Login or Register to view hidden text.

,

Please Login or Register to view hidden text.

,

Please Login or Register to view hidden text.

; существуют реализованные сообществом API для

Please Login or Register to view hidden text.

,

Please Login or Register to view hidden text.

,

Please Login or Register to view hidden text.


Please Login or Register to view hidden text.

и

Please Login or Register to view hidden text.

) (с)википедия


Зачем его ставить?

  • Высокая скорость индексации (до 10-15 МБ/сек на ядро);
  • Высокая скорость поиска (до 150—250 запросов в секунду на каждое ядро с 1000000 документами);
  • Высокая масштабируемость (крупнейший известный кластер индексирует до 3000000000 документов и поддерживает более 50 миллионов запросов в день);
  • Распределенная возможность поиска;
  • Поддержка нескольких полей полнотекстового поиска в документе (до 32 по умолчанию);
  • Поддержка нескольких дополнительных атрибутов для каждого документа (то есть группы, временные метки и т. д.);
  • Поддержка

    Please Login or Register to view hidden text.

    ;
  • Поддержка однобайтовых кодировок и

    Please Login or Register to view hidden text.

    ;
  • Поддержка морфологического поиска — имеются встроенные модули для английского, русского и чешского языков; доступны модули для французского, испанского, португальского, итальянского, румынского, немецкого, голландского, шведского, норвежского, датского, финского, венгерского языков;
  • Родная поддержка

    Please Login or Register to view hidden text.

    (всех типов таблиц, в том числе

    Please Login or Register to view hidden text.

    ,

    Please Login or Register to view hidden text.

    , NDB, архив и т. д.);
  • Родная поддержка

    Please Login or Register to view hidden text.

    ;
  • Поддержка

    Please Login or Register to view hidden text.

    совместимых баз данных (

    Please Login or Register to view hidden text.

    ,

    Please Login or Register to view hidden text.

    и т. д.);
    (с) википедия
Установка

Код:
# cd /usr/ports/textproc/sphinxsearch
# make config
Убеждаемся, что никакая нечисть не убрала дефолтовые отметки с mysql и iconv. Если убрала - ставим.
Код:
# make install
...
#rehash
Настройка
Создаем конфигурационный файл /usr/local/etc/sphinx.conf для поиска по форуму

Код:
source torrentpier
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = user
    sql_pass                = pass
    sql_db                  = dbase
    sql_query_pre          = SET NAMES utf8
    sql_query_pre          = SET CHARACTER_SET_RESULTS=utf8
    sql_query_pre          = SET CHARACTER_SET_CLIENT=utf8
}

source topics: torrentpier
{
    sql_query              = \
        SELECT topic_id, forum_id, topic_title \
        FROM bb_topics \
        WHERE topic_id BETWEEN $start AND $end

    sql_query_range        = SELECT MIN(topic_id), MAX(topic_id) FROM bb_topics
    sql_range_step          = 100000

    sql_attr_uint          = forum_id
    sql_ranged_throttle    = 50
    sql_query_info          = SELECT * FROM bb_topics WHERE topic_id = $id
}

source posts: torrentpier
{
    sql_query              = \
        SELECT pt.post_id, pt.post_text, t.topic_title, t.topic_id, t.forum_id \
        FROM bb_posts_text pt \
            LEFT JOIN bb_topics t on pt.post_id = t.topic_first_post_id \
        WHERE pt.post_id BETWEEN $start AND $end

    sql_query_range        = SELECT MIN(post_id), MAX(post_id) FROM bb_posts_text
    sql_range_step          = 100000

    sql_attr_uint          = topic_id
    sql_attr_uint          = forum_id
    sql_ranged_throttle    = 50
    sql_query_info          = SELECT * FROM bb_posts_text WHERE post_id = $id
}

source users: torrentpier
{
    sql_query              = \
        SELECT user_id, username \
        FROM bb_users \
        WHERE user_id BETWEEN $start AND $end

    sql_query_range        = SELECT 1, MAX(user_id) FROM bb_users
    sql_range_step          = 1000
    sql_query_info          = SELECT * FROM bb_users WHERE user_id = $id
}

index topics
{
    docinfo                = extern
    morphology              = stem_enru
    charset_type            = utf-8
    charset_table          = 0..9, A..Z->a..z, _, a..z, U+410..U+42C->U+430..U+44C, U+42E..U+42F->U+44E..U+44F, U+430..U+44C, U+44E..U+44F, U+0401->U+0435, U+0451->U+0435, U+042D->U+0435, U+044D->U+0435
    min_prefix_len          = 0
    min_infix_len          = 0
    min_word_len            = 1
    min_stemming_len        = 4
    enable_star            = 1
    phrase_boundary        = :, - , . , $
    phrase_boundary_step    = 1
    html_strip              = 1
    path                    = /var/db/sphinxsearch/data/topics
    source                  = topics
}

index posts: topics
{
    path                    = /var/db/sphinxsearch/data/posts
    source                  = posts
}

index users: topics
{
    path                    = /var/db/sphinxsearch/data/users
    source                  = users
}

indexer
{
    mem_limit              = 256M
}

searchd
{
    listen                  = 127.0.0.1:3312
    log                    = /var/db/sphinxsearch/log/searchd.log
    query_log              = /var/db/sphinxsearch/log/query.log
    read_timeout            = 5
    max_children            = 15
    max_matches            = 5000
    seamless_rotate          = 1
    preopen_indexes        = 0
    unlink_old              = 1
    pid_file                = /var/db/sphinxsearch/searchd.pid
}
Прошу обратить внимание на пути!
1. Пути в вашем конкретном случае (другая ОС или вообще личные предпочтения по размещению) будут отличаться. В моем случае в /var/db/ живут все базы данных.​
2. Папки data и log создайте вручную

Запуск

Индексируем в первый раз​
Код:
# indexer --all
Если все нормально, вам отрапортуют об успешном завершении и покажут число обработанных записей. Если нет - ищите где ошиблись в конфигурации​

Ну и запускаем собственно сервер​
Код:
# searchd
Обновление баз

Для актуальности поиска, необходимо в крон добавить следующее​
Код:
*/15 * * * * /usr/local/bin/indexer topics --rotate
0 3 * * * /usr/local/bin/indexer --all --rotate

База тем обновляется каждые 15 минут. Все базы обновляются раз в сутки в 3 ночи

Подключение Сфинкса как поисковой системы к ТП2

config.php
Код:
$bb_cfg['search_engine_type']          = 'sphinx';
 

Mikotka

Пользователь
DarkMod,
В смысле как? Просто в поисковой строке вбиваю и ищет... то, что ищет именно через Sphinx видно по логам

Код:
[Wed Oct 26 11:42:27.843 2011] 0.000 sec [bool/0/rel 0 (0,20)] [topics] [Mikotka ([х.х.х.х)] 444
[Wed Oct 26 11:43:55.493 2011]  0.000 sec [bool/0/rel 1 (0,20)] [topics] [Mikotka ([х.х.х.х)] ..........
[Wed Oct 26 11:44:18.752 2011] 0.000 sec [bool/0/rel 4 (0,20)] [topics] [Mikotka ([х.х.х.х)] ..........

Многоточия это я русские названия вбивал. Все нашлось, только в логи вот так скинулось :)
 

Basilevs

Пользователь
PHP:
*/15 * * * * /usr/local/bin/indexer topics --rotate

Не забываем - время обновления стоит задавать основываясь на времени появления новых topics, posts, users.

Кому-то это нужно вызывать раз в 15 мин., а кому-то и раз в пару часов. :)
 

Mikotka

Пользователь
DarkMod,
Как то не очень... +-1 сивпол работает на ура. С отсечением * и без нее неадекватно. В смысле то работает, то нет. Сейчас некогда, попозже поиграюсь. По идее тут копать
Код:
    min_prefix_len          = 0
    min_infix_len          = 0
    min_stemming_len        = 4

Basilevs,
Я для того и расшифровку дал строк крона, чтоб кому надо поменяли как надо :)
 

Mikotka

Пользователь
DarkMod,
А как вы так умудрились запустить? У меня, если выставить min_..._len в любое значение отличное от нуля, то при создании/обновлении индексов
Код:
webserv# indexer --all --rotate
Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/usr/local/etc/sphinx.conf'...
indexing index 'topics'...
ERROR: index 'topics': field 'forum_id' is marked for both infix and prefix indexing.
total 0 docs, 0 bytes
total 0.053 sec, 0 bytes/sec, 0.00 docs/sec
indexing index 'posts'...
ERROR: index 'posts': field 'post_text' is marked for both infix and prefix indexing.
total 0 docs, 0 bytes
total 0.092 sec, 0 bytes/sec, 0.00 docs/sec
indexing index 'users'...
ERROR: index 'users': field 'username' is marked for both infix and prefix indexing.
total 0 docs, 0 bytes
total 0.002 sec, 0 bytes/sec, 0.00 docs/sec
total 0 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 0 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

Сейчас залез в маны (да да, если ничего не получается, прочитайте инструкцию :) )
If you want partial word matching, then you’re going to need to tell Sphinx to either index prefixes (the beginnings of words) or infixes (substrings of words). You cannot enable both at once, though.
You need to tell Sphinx what the minimum infix or prefix length is – the smaller the number is, the larger your index gets. If you set it to zero, though, that disables this feature. If you want absolutely everything, down to the last character, then set min_infix_len to 1 – but be prepared for the performance hit.
Пока выставил
Код:
  min_prefix_len          = 0
    min_infix_len          = 3

И, кстати, у вас работает поиск по сообщениям внутри темы?
 

DarkMod

Легенда
Mikotka, хз, но у меня как то работает
на досуг
Код:
http://sphinxsearch.com/forum/view.html?id=1575
И, кстати, у вас работает поиск по сообщениям внутри темы?
Да работает, только по полным словам. сокращенным не как
 
Сверху