Существует возможность заменить поставляемые с модулем поиска поисковые механизмы на другие, например, на Sphinx, Solr или даже внешнюю поисковую систему, такую как Яндекс.XML или Google Site Search. Такая потребность может возникнуть в случае неудовлетворительной производительности встроенных библиотек на медленном сервере, при большой нагрузке или значительном объёме проиндексированной информации.
Для этого необходимо создать класс-адаптер для поисковой системы, реализующий интерфейс nc_search_provider. При этом, в зависимости от возможностей выбранной библиотеки, можно использовать или не использовать возможности, заложенные в модуль поиска (индексатор и HTTP-робот, анализаторы и фильтры текста, корректировщики запросов и т.п.).
public function first_run()
Тип: void
Метод вызывается однократно при первом запуске модуля после его установки и смене значения SearchProvider на вкладке «Настройки» — «Системные». В данном методе можно выполнить действия, необходимые для начала работы с поисковой системой.
public function check_environment()
Тип: void
Проверка правильности настроек PHP и окружения веб-сервера. Если имеются ошибки в конфигурации, метод должен вывести диагностические сообщения при помощи функции nc_print_status("Сообщение", "error"). Ошибки будут отображены на странице «Информация» в панели управления модулем.
public function process_document(nc_search_document $document)
Тип: void
Обработать документ (конкретный класс должен проверить, есть ли документ в индексе, и в зависимости от этого обновить существующий документ или добавить новый).
public function remove_document(nc_search_document $document)
Тип: void
Удаление документа из индекса.
public function commit()
Тип: void
Запись проделанных изменений в индекс (используется, когда при обработке документа в методах process_document() и remove_document() запись изменений на диск не производится, изменения сохраняются в памяти).
public function optimize()
Тип: void
Запуск оптимизации индекса, если таковая необходима (выполняется после окончания переиндексирования области).
public function find(nc_search_query $query[, boolean $should_highlight = true])
Тип: nc_search_result
Выполнение запроса $query. Параметр $should_highlight указывает, следует ли подсвечивать совпавшие слова в результатах. Метод должен вернуть объект класса nc_search_result, содержащий информацию о найденных документах в виде объектов класса nc_search_result_document. Для получения текста поискового запроса используйте метод $query->to_string().
public function index_area(string $area_string[, int $run_type = nc_search::INDEXING_NC_CRON])
Тип: void
Запуск переиндексирования области.
$area_string — идентификатор правила или описание индексируемой области
$run_type — тип запуска: запуск из консоли (nc_search::INDEXING_CONSOLE), из консоли с возможностью перезапуска процесса индексирования (nc_search::INDEXING_CONSOLE_BATCH), «Управления задачами» NetCat (nc_search::INDEXING_NC_CRON) или в «реальном времени» в браузере (nc_search::INDEXING_BROWSER).
Если ваша служба поиска имеет в своём составе HTTP-робот, который скачивает информацию с сайта, в этом методе необходимо послать команду на запуск переиндексирования. Пути страниц, описанных в $area_string можно получить следующим образом:
$area = new nc_search_area($area_string); $urls = $area->get_urls(); // массив только со стартовыми URL
Механизм определения того, входит ли страница в заданную область, придётся реализовывать самостоятельно средствами поисковой службы.
Если HTTP-робота в службе поиска нет, используйте имеющийся в модуле поиска класс nc_search_indexer:
return nc_search_indexer::index_area($area_string, $runner_type);
public function schedule_indexing(string $area_string, int $timestamp)
Тип: void
Запланировать переиндексирование области или правила $area_string в указанное время ($timestamp — UNIX timestamp). Если вы используете индексатор, встроенный в модуль поиска:
return nc_search_scheduler::schedule_indexing($area_string, $timestamp);
public function is_reindexing()
Тип: mixed
Проверка на то, запущен ли в данный момент процесс индексирования. (Запуск нескольких задач индексирования одновременно невозможен, поскольку может привести к повреждению поискового индекса.)
Метод должен вернуть FALSE, если индексирование в момент вызова не запущено, иначе — объект nc_search_indexer_task в случае использования встроенного индексатора, или TRUE:
return nc_search_indexer::get_current_task();
public function suggest_titles(string $input, string $language, int $site_id)
Тип: array
Получить массив с заголовками страниц, подходящих под запрос пользователя ($input).
Метод должен вернуть двумерный массив с результатами или пустой массив, если подходящих заголовков не найдено. Каждый результат должен содержать элементы "label" (заголовок страницы) и "url" (путь до страницы).
public function has_term(string $term)
Тип: Boolean
TRUE, если слово имеется в поисковом индексе, иначе FALSE.
public function count_documents()
Тип: integer
Получить количество проиндексированных документов.
public function count_terms()
Тип: integer
Получить количество различных слов в поисковом индексе.
Желательно, чтобы ваш класс-адаптер мог использовать стандартный для модуля поиска синтаксис запросов. (Поисковый сервер Solr полностью совместим не только с языком запросов, но и с форматом файлов, используемых Zend_Search_Lucene, поскольку использует Java-библиотеку Lucene.)
Если вам необходима дополнительная информация о классах nc_search_document, nc_search_query, nc_search_area, вы можете узнать подробности из комментариев к их исходным кодам.
После создания класса-адаптера для поисковой службы необходимо добавить в таблицу Search_Extension запись о нём:
INSERT INTO Search_Extension SET ExtensionInterface='nc_search_provider', ExtensionClass='имя вашего класса';
На вкладке «Настройки» — «Системные» в поле «SearchProvider» укажите имя вашего класса.
Затем, исходя из возможностей службы поиска, необходимо на вкладке «Настройки» — «Расширения» указать расширения, используемые при обработке текста.