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

max_matches, cutoff и limit в «Сфинксе»

Вчера температурил, хотя хотелось спать (всю неделю не высыпался), не мог уснуть — голова болела. Поэтому до 11 вечера общался по скайпу Андреем Аксёновым, автором «Сфинкса», хотелось выяснить некоторые туманные для себя вещи.

Например, в SphinxQL есть три способа ограничить количество выдаваемых результатов — limit, max_matches и cutoff. Разница между первыми двумя мне быстро стала очевидной после чтения документации, а что такое cutoff я не понимал. В доке написано следующее:

«cutoff» — integer (max found matches threshold)

В общем, я узнал, давайте расскажу.

Рассмотрим вот такой запрос, что здесь значит каждая цифра?

SELECT * FROM documents
WHERE orgid IN (5,10,222)
ORDER BY timestamp DESC
LIMIT 500, 1000
OPTION max_matches=2000, cutoff=5000

«Сфинкс» хранит результат запроса в памяти. Чтобы однажды не сожрать всю память, есть параметр max_matches, он определяет размер буфера, куда будут складываться результаты.

Если убрать в нашем запросе параметр cutoff, «Сфикс» пройдётся по индексу «documents», складывая выбранное в соответствии с критерием, в буфер размером в 2000 строк (на самом деле, насколько я понял, буфер хранит не сами строки, а их идентификаторы), располагая данные в порядке сортировки (priority queue).

После того как весь индекс был просмотрен, мы выдаём 1000 строк из буфера, начиная с пятисотой позиции (LIMIT 500,1000).

Теперь вернём cutoff. Этот параметр означает, что мы остановимся не после того как просмотрим весь индекс, а как только будут просмотрены 5000 строк, совпавшие с критерием. Это, очевидно, инструмент тонкой настройки, который позволяет принести в жертву производительности полноту поиска.

6 комментариев
Vlad528 2013

резонно, особенно если есть возможность продолжить поиск. вполне возможно пользователя удовлетворит первые N строк

Eyeless 2013

Очепятка в заголовке

Евгений Степанищев (bolknote.ru) 2013

Комментарий для Eyeless:

Увидел, спасибо!

empregador 2014

Отлично! Спасибо большое!

Теперь появилась полная ясность )

VS 2018

позволяет привести в жертву производительности полноту поиска > пожертвовать полнотой поиска ради производительности

Евгений Степанищев 2018

VS, не понял, это знак «больше» или предложенная правка?