Простенькое sphinx api на php возвращающее лишь массив, без всего лишнего. Метод buildExcerpts для построения сниппетов юзать совершенно не обязательно. Зачем делать лишние запросы, ведь это по сути лишний запрос к searchd, который на highload проектах даст лишнюю нагрузку. Параметры сниппетов либо любые иные вычисления, укажем сразу в методе SetSelect.
Кроме того в текущих версиях api отсутствует метод setMatchMode, вместо него рекомендуется юзать синтакисом запросов. Сделаем так, если по фразе результатов нет, то разбиваем слова через прямой слеш и ищем любое слово. Естественно, всё это ещё можно усовершенствовать, результаты дополнять, сдвигов тоже нет, но это уже там где это всё необходимо.
<?php
empty($_GET['q']) && exit('[]');
$q = trim(preg_replace('#[^a-z0-9а-яйёЁЙ\s]#iu', '', $_GET['q']));
$q = preg_replace('#\s+#', ' ', $q);
empty($q) && exit('[]');
$index = 'index_data';
require("sphinxapi.php");
$cl = new SphinxClient();
$q = $cl->EscapeString($q);
$cl->SetServer('localhost', 9306);
$cl->SetSelect("*, SNIPPET(title, '$q', 'limit=60', 'around=3') AS snippet");
$res = $cl->query($q, $index);
if (empty($res['matches']) && substr_count($q, ' ')) {
$q = implode('|', explode(' ', $q));
$res = $cl->query($q, $index);
}
if (!empty($res['matches'])) {
exit(json_encode(array_column($res['matches'], 'attrs'), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
exit('[]');