Что такое Sphinx?

«Что такое Sphinx?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 отлично подходит для задач, где требуется низкая задержка поиска: каталоги товаров, поиск по новостям, документам или логам.