2. Как мы используем Sphinx
Как поисковой движок для различных сервисов :)
- поиск объявлений на сайте - 30m docs (14GB), 10k+ qps
- поиск объявлений в BO - 570m docs (350GB), <10 qps
- поиск рекламных объявлений с аукционом - UDF rank
- микросервисы (подсказки, «suggest» и тп)
Server qps (x16 ~ 12k пик) Server CPU
3. Сверхбыстрая индексация из БД
Индексатор на сервер с данными (DB, xml, etc)
или реплика на сервер с indexer, кому как удобно
Весь ресурс базы отдаем индексатору
Мы ставим репликацию pg londiste на паузу, это также не позволяет данным
меняться в процессе построения индексов.
Параллельное построение индексов
Больше стоп-слов, выше скорость
Построение индексов в tmpfs
Конечно же, если позволяет объем оперативной памяти
8. Обновление атрибутов в кластере из реплик
Задача: обновить атрибут в Sphinx
Проблема: много реплик, обновлять на каждом не вариант
Решение: специальный распределенный индекс
9. Динамические или разряженные атрибуты
Особенность данных:
1) много атрибутов (сотни)
2) в каждом документе заполнены единицы
Проблемы:
1) тяжелый запрос на вычитку
2) нечитаемые конфиг
3) для добавления новых атрибутов reindex
4) лишние данные в spa
Решение: JSON
+ добавление новых атрибутов на лету
+ на наших данных в 4 раза меньше вес индекса
+ выше скорость индексации
- чуть ниже скорость поиска
- нельзя обновлять кусочком, только весь json
11. Бытрые поиск на последних страницах
Минусы решения:
- нужно знать кол-во результатов
перед поиском
- в приложении выполнять
обратную сортировку результата
- дополнительная реализация
13. Фильтр "ИЛИ" по атрибутам и т.п.
SphinxQL
SQL
С помощью expression в запросе можно творить чудеса:
14. Сложные и быстрые выражения в SphinxQL
Парсинг большого запроса в Sphinx
тяжелая операция относительно других.
Очень сложные запросы лучше прятать в UDF
UDF - это просто!