Процесс поиска состоит из двух этапов — сохранения в поисковом индексе (индексирования) и извлечения документов из него (собственно поиска).
I. Индексирование:
II. Поиск: извлечение из поискового индекса документов, соответствующих запросу пользователя.
Модуль поиска состоит из следующих частей:
Поставщик службы поиска (интерфейс nc_search_provider). Обеспечивает хранение документов, полнотекстовый поиск по ним; также может управлять способом загрузки документов (служба поиска может реализовать получение документов самостоятельно) и планированием заданий переиндексирования. По умолчанию используется библиотека Zend_Search_Lucene; дополнительные свойства документа (такие как полный текст документа, его тип и т.п.) хранятся в СУБД в таблице Search_Document для увеличения быстродействия и удобства организации процесса переиндексирования.
Планировщик переиндексирования (nc_search_scheduler). Отвечает за запуск переиндексирования областей согласно расписанию.
Индексатор (по умолчанию — nc_search_indexer). Отвечает за обработку задачи переиндексирования: обеспечивает загрузку всех страниц, находящихся в очереди текущей задачи переиндексирования, обработку полученных данных и их сохранение в поисковом индексе.
Обработчики документов (интерфейс nc_search_document_parser). Обеспечивают извлечение данных из документов различных типов (например, HTML-документов, текстовых файлов и т.п.)
Анализаторы текста (наследуют абстрактный класс nc_search_language_analyzer). Обеспечивают приведение слов к базовой форме (морфологический анализ или стемминг).
Текстовые фильтры (наследуют абстрактный класс nc_search_language_filter). Отвечают за приведение слов во всех документах и поисковых запросах к нормальной (базовой) форме.
Корректировщики пользовательских запросов (наследуют абстрактный класс nc_search_language_corrector): орфографическая проверка введённого запроса или иные способы исправления запросов, не давших результатов.
Все части модуля, реализующие интерфейсы или наследуемые от указанных в списке абстрактных классов, могут быть заменены на пользовательские. Все эти интерфейсы и абстрактные классы расширяют интерфейс nc_search_extension.
За подключение расширений модуля отвечает класс nc_search_extension_manager. Когда модулю необходимо получить объект, реализующий какую-либо функциональность, происходит вызов метода nc_search_extension_manager::get($extension_interface, $context)
.
Объект $context (экземпляр класса nc_search_context) содержит дополнительные сведения о контексте операции, такие как MIME-тип документа и его язык. Менеджер расширений подбирает список подходящих под контекст расширений и возвращает их в виде объекта nc_search_extension_chain.
Расширения могут быть применены к исходным данным последовательно при помощи метода apply() (например, в случае текстовых фильтров); может быть взято расширение с высшим приоритетом (например, будет использован только один — первый — обработчик для каждого из типов документов).
Для добавления расширения необходимо написать класс, реализующий соответствующий интерфейс, и добавить его в панели управления модулем в список на вкладке «Настройки» — «Расширения», указав условия его использования (язык документа, тип документа, активная служба поиска).