Я хотел получить данные из Sphinx без ключевого слова запроса, но с фильтрами из других атрибутов. Эти другие атрибуты являются целыми числами. Вот атрибуты нашего индекса:
id - Integer keyword - String keyword_ord - Integer words - Integer results - Integer
В нашей таблице имеется около 300 миллионов ключевых слов, и мы попытались решить эту проблему, используя пустой запрос в Sphinx (примечание: мы используем PHP и MySQL). Предположим, мы хотели получить ключевые слова, которые содержат от 3 до 6 слов, и те, которые имеют результаты от 3000 до 10000, затем мы используем функцию SetFilterRange () API Sphinx в PHP.
$sphinx->SetFilterRange( 'words', 3, 6 ); $sphinx->SetFilterRange( 'results', 3000, 10000 );
Затем, чтобы выполнить поиск, мы отправляем пустой запрос.
$results = $sphinx->query( '' );
Проблема в том, что запрос по-прежнему выглядит медленнее, чем мы ожидали. Как вы думаете, есть лучший способ получить данные с фильтрами, отличными от отправки пустого запроса в Sphinx? Или есть лучшее решение для этого, кроме самого Сфинкса?
В моей догадке, хотя, я думаю, причина, по которой это медленно, состоит в том, что Sphinx должен фактически пробивать все 300 миллионов ключевых слов, чтобы найти все, что попадает под фильтры. Если в указанном запросе есть ключевое слово (вместо пустого запроса), с помощью индексов ему не нужно выполнять все ключевые слова, а пропускать строки, которые не содержат ключевых слов. Если это причина, то должен быть лучший подход к решению этого, кроме использования Sphinx.
Что касается наших характеристик аппаратного обеспечения сервера:
Сфинкс очень хорошо справляется с этой задачей. Ваши спецификации немного ниже (память), и их нужно немного поднять. Если у вас 300 миллионов строк (с индексом), только MySQL поедает тонну этой памяти. Для начала я обновил бы до 8 ГБ памяти.
После обновления памяти я буду играть с конфигурацией Sphinx. Я бы начал с добавления / использования этих параметров …
searchd { max_matches = 200000 max_filter_values = 300000 }
max_matches ограничит количество итоговых результатов в целом, нет причин возвращать 300 миллионов результатов.
max_filter_values - это просто вариант проверки работоспособности. Это не позволит кому-то выбрать 300 миллионов тегов в качестве опции фильтра.
Чтобы найти пустой запрос, вам необходимо:
$results = $sphinx->query( '*' );
Я могу рассказать вам по опыту, что Sphinx достаточно силен, чтобы обрабатывать записи более 300 миллионов.
В большинстве случаев Sphinx просто не хватает ресурсов, чтобы иметь доступ к данным достаточно быстро. «2 ГБ» ОЗУ распределяется по всей системе, поэтому сколько реально доступно для Sphinx может сильно различаться. Я видел, как веб-серверы загружаются и заворачивают экземпляры apache, mysql, memcached и т. Д. И оставляют только 100 МБ ОЗУ, что далека от того, что 300 миллионов поисков строк могут взять imo (не сделали стендовый тест, чтобы узнать фактические цифры)
Кроме того, вы, в конечном итоге, захотите изучить Дельта: Основные решения для индексирования. Если у вас нет настройки нескольких БД для загрузки сервера, то при индексах Sphinx он может заблокировать MySQL до тех пор, пока запрос не будет завершен.
edit Я столкнулся с некоторыми проблемами с PHP API, поэтому я скомпилировал Sphinx C Extension для PHP, и это сработало чудеса, сократив время обработки вдвое. Прежде чем я закончил использовать расширение, я исправил части API, которые ускорили все.
2 из самых важных: – комментируйте все «утверждает» – это может быть не безопасным способом, но утверждение не принадлежит к производству в любом случае. Если вы хотите, чтобы утверждения выполнялись – используйте расширение – найдите все функции «is_int» и замените их на …
if ((int)$v === $v) { /* code here */ }
Типизация на самом деле примерно на 30% быстрее при больших запросах.
Спасибо за ваш ответ CrazyVipa (я сотрудник Ronalds).
В настоящее время наша RAM установлена на 2 ГБ только потому, что никто не использует наш сайт на данный момент. Обычно, когда мы используем Sphinx, мы устанавливаем RAM на 12-16 ГБ. Мы отслеживали использование ОЗУ и не превышали 10 ГБ.
Но мы попробуем ваши варианты настройки и запроса.
Мы вернемся сюда завтра.