назад
24 янв

Полнотекстовый поиск

Как можно делать полнотекстовый поиск:

Встроенный поиск 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, которые являются не готовыми поисковыми серверами, а библиотеками, которые можно использовать для самостоятельной реализации полнотекстового поиска.