Простенькое 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('[]');