Выполните пустой запрос с фильтрами в Sphinx

Я хотел получить данные из 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.

Что касается наших характеристик аппаратного обеспечения сервера:

  • Процессор: Intel (R) Xeon (R) CPU E5-2630 0 @ 2.30 ГГц (8 ядер)
  • Память: 2 ГБ
  • Дисковое пространство: 250 ГБ

Сфинкс очень хорошо справляется с этой задачей. Ваши спецификации немного ниже (память), и их нужно немного поднять. Если у вас 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 ГБ.

Но мы попробуем ваши варианты настройки и запроса.

Мы вернемся сюда завтра.