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 строк, совпавшие с критерием. Это, очевидно, инструмент тонкой настройки, который позволяет привести в жертву производительности полноту поиска.
21 сентября 2013 10:47

Vlad528 (инкогнито)
21 сентября 2013, 11:54

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

Eyeless (инкогнито)
21 сентября 2013, 13:46

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

Евгений Степанищев (bolknote.ru)
21 сентября 2013, 14:58, ответ предназначен Eyeless

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

empregador (инкогнито)
27 ноября 2014, 13:43

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

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)