Полнотекстовый поиск
Как можно делать полнотекстовый поиск:
Встроенный поиск MySQL
Размер индекса - 150% данных (меньше - лучше). Скорость работы поиска - порядка 200 мс (меньше - лучше), скорость индексирования - 1.5 мб/с (больше - лучше)
Достоинства:
- Простейший вариант.
- Легок в настройке и использовании
Недостатки:
- Простейший вариант.
- Работает довольно медленно.
- Нет полноценной поддержки стемминга
- Плохо ищет (медленно, не использует индекс) одновременно по нескольким полям (например, название и текст)
- Поддерживает только таблицы MyISAM - которые крайне ненадежны и медленны при тяжелой смешанной многопоточной нагрузке.
Встроенный поиск PostgreSQL
Размер индекса - 150% от размера данных. Скорость работы поиска - порядка 30 мс, скорость индексирования - 1.5 мб/с
Достоинства:
- Полноценный поиск, в т.ч. поддержка многоязычного стемминга
- Встроен в базу данных, нет необходимости отдельно обновлять поисковый индекс
- Обилие готовых решений для Rails на базе этого поиска.
Недостатки:
- Работает довольно медленно
- Большой размер индекса
- Слабая возможность настройки поиска под нужды конкретного проекта
- Необходимость использовать PostgreSQL для хранения данных
Sphinx Search
Размер индекса - 30% данных. Скорость работы поиска - порядка 7 мс, скорость индексирования - 4,5 мб/с
Достоинства:
- Ищет и индексирует быстро. Нет, БЫСТРО!!!!!!1.
- Хорошее качество поисковой выдачи
- Умеренная настраиваемость
Недостатки:
- Слабая возможность настройки поиска под нужды конкретного проекта
- Ориентирован в первую очередь на различные SQL базы данных. MongoDB можно использовать, но это нетривиально
- Сложность настройки и использования индексов с обновлением данных в реальном времени
Solr
Размер индекса - 20% данных. Скорость работы поиска - порядка 25 мс, скорость индексирования - 3 мб/с
Достоинства:
- Хорошее качество поисковой выдачи
- Хорошая настраиваемость
- Хорошее готовое решение для Rails - Sunspot
Недостатки:
- Написан на Java, требует установки и настройки сервлет контейнера и т.д.
Elastic Search
Размер индекса - 20% данных. Скорость работы поиска - порядка 25 мс, скорость индексирования - 3 мб/с
Достоинства:
- Использует проверенную годами библиотеку поиска Lucene, так же как Solr
- Относительно молодой проект. Учтены ошибки и недочеты более старых проектов.
- Поддержка хранения и индексирования документов - данных произвольной структуры, так же как MongoDB
- Полностью настраивается под любые нужды конкретного приложения
- Ищет весьма быстро
- Автоматический шардинг, практически не ограниченная масштабируемость
- Возможность использовать как полноценную базу данных
- Отличное готовое решение для Rails - tire
Недостатки:
- Относительно молодой проект, ещё не так тщательно оттестирован
- Скромная документация, особенно по продвинутым возможностям
Итак, наш выбор:
Сейчас из этих движков мы используем:
PostgreSQL - там, где нужен "просто поиск как-нибудь чтобы был" (например, carcamp). Он работает "из коробки" и более чем покрывает базовые нужды среднего корпоративного сайта.
Sphinx -там, где нужно очень быстро (например, на megalyrics) - пользователи делают до 200 тысяч поисковых запросов в сутки, объем данных для поиска более 5 гигабайт, поиск по 3 000 000 записей
Elastic Search - там, где нужно нетривиально (например, на hottea) - поиск полностью настроен под бизнес-нужды заказчика: чай с одинаковой релевантностью сортируется по возрасту, одновременно с поиском можно использовать фильтры, определенные запросы (например, "пуэр") вызывают переключение режима сортировки, и т.д.
Мы не рассматривали:
Xapian и Lucene, которые являются не готовыми поисковыми серверами, а библиотеками, которые можно использовать для самостоятельной реализации полнотекстового поиска.