Sphinx - ограничение на поиск более 100 страниц [РЕШЕНО]

Здравствуйте, сегодня столкнуся с проблемой, на сайте более 70 тыс топиков, настроил Сфинкс, все работает, отдает результаты поиска, НО
когда ввожу запрос на который выводится более 4000 результатов, пробую перейти на последнюю страницу сайт отдает ошибку


Системная ошибка, повторите позже

Вернуться назад, перейти на главную



Проблема любого запроса начинается с 101 страницы, на 100ой пагинация есть и результаты.

Уважаемые гуру сайта помогите решить проблему, по логам сфинкса все окей, работает как часы, но с это проблемой не понимаю что делать.
Если кто-то знает куда копать отзовитесь буду вам очень признателен.

С помощью умельца 1099511627776 проблема была решена.

Спасибо вам 1099511627776 огромнейшее!

37 комментариев

avatar
Провел небольшое исследование на Вашем сайте.
Мое мнение — неправильно вычисляется количество статей.
т.е. статей грубо 1000 но в индексе показывает 3000
avatar
Ошибку выдает строчка 89 в файле classes/modules/sphinx/Sphinx.class.php
avatar
Вот такая проблема если вывести print $this->oSphinx->_error;
searchd error: offset out of bounds (offset=3250, max_matches=1000)
Так что походу роблема в самом сфинксе
avatar
avatar
Пробовал. Не помагает.
напиал сюда: sphinxsearch.com/forum/view.html?id=10798
avatar
Решение: github.com/livestreet/livestreet/blob/master/classes/modules/sphinx/Sphinx.class.php#L72 тут меняем
$this->oSphinx->SetLimits($iOffset, $iLimit, 50000);
avatar
Если это окончательный вариант (больше ничего дописывать не надо), то у меня эта штука не работает — поиск на сайте перестает что-либо выводить после этого изменения. Ошибок нет, в логах сфинкса ничего нет (в т.ч. поисковых запросов), на сайте пустота…
avatar
Да это окончательный вариант.
avatar
Тогда объясните, пожалуйста, смысл этой строки
$this->oSphinx->SetLimits($iOffset, $iLimit, 50000);

чтобы я мог понять почему у меня это не работает. Что такое 50000?
avatar
Это можно понять имев даже самые базовые знания php.
github.com/livestreet/livestreet/blob/master/engine/lib/external/Sphinx/sphinxapi.php#L387
В крайнем случае
www.php.net/manual/ru/sphinxclient.setlimits.php
avatar
спасибо, понимание процесса прояснилось. С пониманием причины неработоспособности пока хуже…
avatar
Я не силен в сфинксе но по сути это Максимальное количество результатов по запросу. больше которого сфинкс не выдаст
avatar
Провел ручные тесты и выяснил, что у меня можно ставить только до 1000 включительно. Ставлю 1001 и все, поиск отрубается на сайте
avatar
Как именно отрубается? Там можно написать
небольшой print_r($data) после github.com/livestreet/livestreet/blob/master/classes/modules/sphinx/Sphinx.class.php#L88 вот этого if-а и посмотреть какая конкретно ошибка вылазит
avatar
Проблема была в том, что в файле /engine/lib/external/Sphinx/sphinxapi.php стоит дефолтное значение maxmatches = 1000 (217 строка) и поэтому подставлять в
$this->oSphinx->SetLimits($iOffset, $iLimit, ...
больше тысячи он не давал.
Надо вписать другое дефолтное значение и можно смело его ставить в /classes/modules/sphinx/Sphinx.class.php
avatar
Править что-то в API это очень грязный путь, вы уверены что это нельзя сделать через sphinx.conf? max_matches дириктива там есть — sphinxsearch.com/docs/2.0.7/conf-max-matches.html
avatar
не вижу разницы, где ее задавать.
Но вообще, в идеале все равно надо sphinxapi править и задавать этой переменной динамическое значение в зависимости от кол-ва топиков и комментов.
avatar
ещё раз — sphinxapi править это до крайности плохой стиль. Вы правите даже не движок LS, вы правите внешнюю подключаемую библиотеку. По сути, это тоже самое что залезть и что-то исправить в, например, apc.so.

Такие изменения могут добавит вам тонны проблем в будущем, например при обновлении версии LS.

Одно дело, если нет другого выбора, но похоже он есть.
avatar
на сколько я понимаю, независимо от того, что я поставлю в самом сфинксе в качестве maxmatches, он все равно будет руководствоваться sphinxapi, т.к. эта библиотека для него будет выше по приоритету, а в sphinxapi это значение задано дефолтно, как 1000.
Не утверждаю, что я прав, но я потестю
avatar
Плюс почитайте внимательно доку Sphinx — они вообще-то очень не советуют ставить это значение выше чем 10000.
avatar
если честно, я не совсем понимаю, Вашего комментария в мой адрес. Исходя из него, можно смело делать вывод, что решение, предложенное 1099511627776 так же не верно, поскольку он предлагает задавать 50 000.
Плюс мне не ясно что это за поиск, который больше 10000 топиков не рекомендует выдавать в результатах… Здесь явно что-то не так…
avatar
RTFM. max-matches отвечает за то сколько держать в памяти релевантных совпадений (will be kept in RAM while searching each index). Это означает, что чем больше это параметр тем больше расход оперативной памяти Sphinx-ом.

Эта опция прямо влияет на то сколько памяти будет выделятся под буфер каждого запроса к поиску. ( Recklessly raising max_matches to 1,000,000 means that searchd will have to allocate and initialize 1-million-entry matches buffer for every query. )

При росте трафика вы получаете линейный и быстрый рост расхода памяти. Поставьте это параметр большим и при сколь-нибудь заметном трафике на поиск, ваш Sphinx быстро сожрёт всё доступную ему память, и я не знаю что будет потом. В лучшем случае — резкое падение производительности.

Потому разработчики честно вас и предупреждают, что в эти игры лучше не играть.

Ограничение в духе «в результатах поиска показывать только первые X релевантных документов» имеют огромный смысл. Снятие этих ограничений под сколь-нибудь заметной нагрузкой повалит любой сервер.

Вы должны чётко понимать, что именно вы делаете.
avatar
Теперь к сути. max_matches по умолчанию ( если не указан в конфиге Sphinx ) имеет значение 1000. И внимание: «note that you can not set the value in the API higher than the value in the .conf file» Т.е. sphinx.conf всё равно нужно менять, если вы хотите увелисть это значение. И это сокрее всего и было причиной ваших проблем.

Дальше
/engine/lib/external/Sphinx/sphinxapi.php стоит дефолтное значение maxmatches = 1000 (217 строка)
ничего менять не надо — это первичная инициализация объекта и атрибут _maxmatches переписывается при вызове метода SetLimits.
avatar
да, это я прекрасно понимаю и в данный момент ищу способ, как выводить только N релевантных ответов на запрос, поскольку в LS изначально такой функции нет (при нажатии на ссылку «последняя» в пагинации он выдаст ошибку, если эта страница за областью установленного maxmatches).

Собственно, об этом я и говорю, что механизм поиска в LS надо переделать немного.
avatar
там где-то нужно воткнуть простейший if… руки дойдут — посмотрю…
avatar
нет, так просто не отделаетесь) надо увязывать кол-во выводимых топиков и коментов (их выводится больше на странице) с номерами страниц
avatar
$this->oSphinx->SetLimits($iOffset, $iLimit, 50000);


И все, больше ничего.
avatar
Отличное решение, работает узже месяц свинкс себя ведет хорошо и сайт.
avatar
позвольте вопрос из любопытства? чему у Вас равно значение maxmatches в sphinxapi.php и менялось ли оно в сфинксе? Или просто воткнули 50000 ничего не меняя?
avatar
Идеальный вариант конечно подправить логику работы Сфинкса в ЛСе чтоб он динамически подбирал значение по логике:
соответственно чтобы сработал offset=3350, надо matches сделать больше чем оффсет+count в
> лимите. например max_matches=3400

Возможно єто уже вопро к ort
avatar
Огромное вам спасибо уважаемый
1099511627776
просто можно сказать спасли в прямом смысле мой проект, огромная благодарность и плюсиков я понаставил везде!
Чудо просто!

Слов у меня не хватит чтоб описать мою благодарность!

Поклон.
avatar
Я столкнулся с такой же самой проблемой. Вот эта штука
$this->oSphinx->SetLimits($iOffset, $iLimit, 50000);
не работает ни хрена.
Внес такое изменение в строку 72 файла classes/modules/sphinx/Sphinx.class.php
На всякий случай перезапустил apache и nginx. Затем даю команды на полную переиндексацию.
# searchd --stop
# indexer --all
# searchd

Все отрабатывает… в итоге на то слово, где раньше он находил 5293 топика после повторной переиндексации выдает — Удивительно, но поиск не дал результатов. Чуть позже оказалось, что ничего не находит именно после перезапуска apache и nginx. Что делать люди?
avatar
Я поторопился с таким категоричным выводом, прошу прощения.
В sphinx.conf прописал max_matches=100000, теперь все работает и ошибка 101-й страницы тоже исчезла, нажимаю на последнюю и отлично переходит на 530-ю последнюю страницу в найденном. Спасибо за наводку.
avatar
зря, не стоит этого делать. При хоть какой-то посещалке поиска на сайте сервер упадет, т.к. сфинксу оперативной памяти не хватит. Лучше ограничивать поиск определенным количеством страниц (хабровцы так и делают), т.е. например, больше 100 страниц и не выдавать в результатах поиска.
avatar
Ну а как это конкретно сделать? Просто у меня в конфиге вообще не было ничего прописано, это я от балды прописал max_matches=100000. Что то ведь должно быть прописано… Какое значение прописать для выделенного сервера с 16 Gb оперативы. Посещалка дохлая, но стабильная в районе 200-300 в сутки.
avatar
Просто у меня в конфиге вообще не было ничего прописано
По умолчанию стоит 1000, поэтому больше 100 страниц и не показывает.
Ну а как это конкретно сделать?
в пагинации в движке условие выставить: если страниц > чем нужно, то не показывать их.
avatar
А подскажите пожалуйста где это
по умолчанию стоит 1000
Это где то в LS или еще где? В sphinx.conf у меня ничего не было пока я сам не прописал max_matches=100000. Может и ничего страшного нет в таком значении? Вот я запустил поиск, внизу выдало
Memory
memory limit: 4096M
memory usage: 16.071 M
peak usage: 30.750 M
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.