Что такое Sphinx?

Ответ

Sphinx — это высокопроизводительный, полнотекстовый поисковый движок с открытым исходным кодом, предназначенный для быстрого поиска по большим объемам текстовых данных. Он работает как отдельный демон (searchd) и часто используется как альтернатива встроенному полнотекстовому поиску в СУБД (например, в MySQL) для высоконагруженных проектов.

Ключевые особенности и преимущества:

  • Высокая скорость: Оптимизирован для быстрого индексирования и выполнения поисковых запросов, значительно превосходит LIKE или MATCH ... AGAINST в MySQL на больших данных.
  • Гибкость индексирования: Может индексировать данные из различных источников (MySQL, PostgreSQL, XML-пайпы) с поддержкой морфологии (стемминг, обработка стоп-слов, синонимы).
  • Масштабируемость: Поддерживает распределенное индексирование и поиск по нескольким индексам.
  • API для языков: Имеет клиентские API для PHP, Python, Java и других.

Базовый пример конфигурации (sphinx.conf):

source src_articles {
    type      = mysql
    sql_host  = localhost
    sql_user  = app_user
    sql_pass  = password
    sql_db    = my_database
    sql_query = SELECT id, title, content, UNIX_TIMESTAMP(created_at) AS created_ts FROM articles
}

index idx_articles {
    source    = src_articles
    path      = /var/lib/sphinxsearch/data/idx_articles
    charset_type = utf-8
    min_word_len = 2
}

searchd {
    listen      = 9312
    log         = /var/log/sphinxsearch/searchd.log
    query_log   = /var/log/sphinxsearch/query.log
}

Использование из PHP (через SphinxAPI):

require_once('sphinxapi.php');

$cl = new SphinxClient();
$cl->SetServer("localhost", 9312);
$cl->SetMatchMode(SPH_MATCH_EXTENDED2);
$cl->SetLimits(0, 20);

// Выполнение поискового запроса
$result = $cl->Query("быстрый поиск", "idx_articles");

if ($result !== false) {
    if (!empty($result["matches"])) {
        foreach ($result["matches"] as $docId => $docInfo) {
            echo "Найден документ ID: $docIdn";
        }
    } else {
        echo "Ничего не найдено.n";
    }
} else {
    echo "Ошибка запроса: " . $cl->GetLastError();
}

Sphinx отлично подходит для задач, где требуется низкая задержка поиска: каталоги товаров, поиск по новостям, документам или логам.

Ответ 18+ 🔞

А, Sphinx! Ну это ж классика, ебать мои старые костыли. Представь себе: у тебя база данных с миллионами записей, и тебе нужно искать по тексту быстрее, чем муха срет. MySQL свой LIKE или даже MATCH на таких объемах начинает тупить, как пьяный слон в посудной лавке. Вот тут-то этот самый Sphinx и выезжает на сцену, как спаситель.

Что это за зверь такой?

По сути, это отдельный демон, searchd, который живёт своей жизнью рядом с твоей БД. Он не встроен в MySQL, а работает сам по себе, и это его главный козырь. Он тупо создаёт свои собственные, супер-оптимизированные индексы из твоих данных и потом по ним шпарит со скоростью света. Ёпта, разница в скорости — просто овердохуища, особенно когда данных реально много.

Чем он хорош, кроме скорости?

Ну, во-первых, гибкость. Он может хавать данные откуда угодно: из MySQL, из PostgreSQL, даже из какого-нибудь XML-файла, который ты ему в пайп сунешь. Морфологию поддерживает — то есть ищет не только точное совпадение, а понимает основы слов, отсекает всякие «и», «в», «на» (стоп-слова), синонимы можно подкрутить. Во-вторых, масштабируется. Если один сервер уже не тянет, можно индексы по разным машинам раскидать и искать по ним всем сразу. И, конечно, для всех популярных языков есть свои APIшки — PHP, Python, Java, так что интегрируется без проблем.

Как это выглядит под капотом?

Вот смотри, самый простой конфиг (sphinx.conf). Выглядит, конечно, как заклинание древних, но ничего сложного:

source src_articles {
    type      = mysql
    sql_host  = localhost
    sql_user  = app_user
    sql_pass  = password
    sql_db    = my_database
    sql_query = SELECT id, title, content, UNIX_TIMESTAMP(created_at) AS created_ts FROM articles
}

index idx_articles {
    source    = src_articles
    path      = /var/lib/sphinxsearch/data/idx_articles
    charset_type = utf-8
    min_word_len = 2
}

searchd {
    listen      = 9312
    log         = /var/log/sphinxsearch/searchd.log
    query_log   = /var/log/sphinxsearch/query.log
}

Объясняю: в source ты говоришь, откуда брать данные. В index — куда и как их складывать. А в searchd — как самому демону работать. Порт 9312 — его родной.

А как с ним из PHP общаться?

Да элементарно! Качаешь ихнюю библиотечку SphinxAPI и пишешь что-то вроде этого:

require_once('sphinxapi.php');

$cl = new SphinxClient();
$cl->SetServer("localhost", 9312);
$cl->SetMatchMode(SPH_MATCH_EXTENDED2);
$cl->SetLimits(0, 20);

// Выполнение поискового запроса
$result = $cl->Query("быстрый поиск", "idx_articles");

if ($result !== false) {
    if (!empty($result["matches"])) {
        foreach ($result["matches"] as $docId => $docInfo) {
            echo "Найден документ ID: $docIdn";
        }
    } else {
        echo "Ничего не найдено.n";
    }
} else {
    echo "Ошибка запроса: " . $cl->GetLastError();
}

Подключаешься, настраиваешь, шлёшь запрос — и получаешь результат быстрее, чем успеваешь сказать «ёперный театр».

Короче, где его применять?

Да везде, где поиск должен быть быстрым, а данных — дохуя. Интернет-магазины с гигантскими каталогами, поиск по новостным архивам за десять лет, анализ логов, документооборот. Если твой текущий поиск начинает бздеть и тормозить под нагрузкой — самое время посмотреть в сторону Sphinx. Он, конечно, не серебряная пуля, и его надо настраивать, но когда разберёшься — ни хуя себе, как хорошо работает.