SphinxClient API с подсветкой сниппетов

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

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *