akalend
@akalend
программирую

Ограничение PHP SphinxAPI на поиск совпадений

В функции function SetLimits ( $offset, $limit, $max=0, $cutoff=0 ) есть ограничение $max=1000 на кол-во возвращающего рекордсета.
$sphinx->SetLimits (0, self::LIMIT_A, 1000 );
Если увеличить эту константу или в самом файле sphinxapi.php то сфинкс-демон вернет ошибку:
Query failed: searchd error: per-query max_matches=10000 out of bounds (per-server max_matches=1000).
Как можно вытащить следующие 1000 значений? Нижеуказанный код не подходит.
$sphinx->SetLimits (1000, self::LIMIT_A, 1000 );
  • Вопрос задан
  • 6505 просмотров
Пригласить эксперта
Ответы на вопрос 3
akalend
@akalend Автор вопроса
программирую
заминусовать — много ума не надо
а вот ответить, как видно не хватает…
Ответ написан
Комментировать
Посмотреть хелп по сфинксу — много ума надо.
А вот написать вопрос видимо хватает :D

Увеличивать надо не константу и не в файле sphinxapi.php а в вашем конфиге сфинкса

www.sphinxsearch.com/docs/current.html#api-func-setlimits — хелп по SetLimits, в нем написано про max_matches
www.sphinxsearch.com/docs/current.html#conf-max-matches

Просто в конфиге выставляете нужное количество max_matches.
Ответ написан
@freeman08
Может быть кому нибудь будет полезно. Это не лучшее решение, но:
у моего клиента было требование отображать/сохранять абсолютно все результаты поиска.

Шагать с помощью постраничной навигации долго. У меня поиск19567 результатов занимал примерно 6 - 7 секунд с шагом в 1000.

Я решил задаче так:

// листинг кода условный, так как вырваны куски из середины кода, но идея ясна
// pre query
$sphinx->SetLimits( 0, 1, 1);
// получаем сколько всего рузльтатов найдено согласно ключу/прочим параметрам
$pre_res = $sphinx->Query($query, 'index_name');

// устанавливаем лимиты на весь диапазон найденых записей за раз
$sphinx->SetLimits( 0, $pre_res['total_found'], $pre_res['total_found']);
$res = $sphinx->Query($query, 'index_name');

Такой способ выбирает 40728 записей за где то 2 секунды. Естественно время примерное и зависит еще от ряда факторов.
Это не лучшее решение, но в моем случае нужно было только собрать ID найденных записей и сохранить их в базу, для дальнейшей работы. Красивого способа я не нашел, только вот такой "топор" :( .. но "топор" с задачей справляется не так уж и плохо ;)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы