Поиск по сайту

Мы считаем, что реализация полноценного поиска по сайту не входит в область ответственности CMS, поскольку это отдельная сложная задача, для решения которой существуют специализированные инструменты. Fenrir.CMS позволяет легко интегрировать на сайт внешние поисковые движки, и такой подход мы считаем самым правильным.

Яндекс.XML

Поиск - это основная компетенция Яндекса, и он отлично справляется со своей работой. Согласитесь, конкурировать с Яндексом на этом поле - задача не для разработчиков CMS :)

Использование Яндекс.XML позволяет создать сервис высочайшего качества, настроить отображение результатов и формы поиска в соответствии с требованиями дизайна. При этом разработчику (и пользователю) доступен мощный синтаксис поисковых запросов, что позволяет гибко управлять областью поиска: например, на портале Союза Потребителей России пользователи могут ограничить поиск сайтом или форумом.

Однако, поиск на Яндекс.XML имеет некоторые ограничения.

  • Яндекс индексирует сайт не мгновенно, новые документы попадают в индекс с некоторой задержкой (в среднем - неделя)
  • Нельзя реализовать поиск по закрытым данным (например, поиск по личным сообщениям)
  • В сутки можно задавать до 1000 запросов (хватает для большинства проектов, при превышении лимита почти всегда можно решить проблему, присоединившись к рекламной сети Яндекса).

Sphinx

Sphinx - это бесплатный открытый поисковый движок с поддержкой морфологии русского языка. Sphinx позволяет индексировать данные из БД, поэтому не имеет ограничений для закрытых данных. Кроме того, индексация проекта происходит значительно быстрее.

Основной недостаток этого движка состоит в необходимости установки и конфигурации, что делает невозможным его использование на виртуальном хостинге. Однако, при нынешних ценах на VPS для серьезного проекта это не представляется проблемой.

Или все-таки свой?

В принципе, Fenrir.CMS вполне позволяет реализовать поиск самому, и для небольших редко обновляемых проектов такое решение может подойти.

Для реализации поиска необходимо:

  • Создать типы данных "страница в индексе" и "элемент контента в индексе", элемент контента привязывается к странице.
  • Создать класс-индексатор, способный преобразовывать типы данных проекта в соответствующие типы для индекса (для преобразования можно использовать систему правил). Из данных в индексе нужно удалить весь "мусор" - разметку, спец. символы и т.д.
  • Создать обработчик системных событий создания / изменения / удаления, вызывающий методы индексатора.
  • Реализовать несложный модуль для поиска по индексу (FULLTEXT или LIKE, it depends)

Именно таким способом реализован поиск по сайту завода Мценскпрокат - и он вполне справляется со своими задачами.