CNSearch - Плагины (Plug-ins)
Плагины - это специально подключаемые модули, позволяющие гибко расширять функциональные возможности программы. В CNSearch плагины используются для индексации файлов разных форматов.
Плагины должны находится в одном каталоге с индексатором. В Unix и Linux версиях они имеют расшрение .so, в Windows - .dll. Если вы хотите отключить какой-нибудь плагин, вы можете переместить его в другой каталог.
На данный момент в дистрибутив входит три плагина, позволяющие индексировать файлы следующих форматов:
Имя файла в Unix/Linux версии | Имя файла в Windows версии | Тип обрабатываемого документа |
---|---|---|
libtxt.so | libtxt.dll | *.TXT - текстовые файлы |
librtf.so | librtf.dll | *.RTF - файлы Rich text format |
libdoc.so | libdoc.dll | *.DOC - файлы документов Microsoft Word |
В версии 0.92 плагины не пытаются определять кодировку документов, ибо для большинства форматов этого и не надо.
Для документов обработанных плагинами поле "кодировка" заменяется на заданный в плагине текст, благодаря чему можно написать поисковый шаблон таким образом, чтобы выделить тип найденного документа. Вы можете посмотреть, как это сделано на сайте Новгородского Государственного Университета.
Во время запуска индексатор выводит список подключенных плагинов, например:
F:\1\bin\indexer>searchctl.exe localhost CNSearch ver.0.92 [build 2073] Compiled Вс 07.04.2002 under Microsoft Windows 2000 [Версия 5.00.2195] Rebuilding URL list...Ok. Loading library: RTF (Rich text format) Loading library: TXT (Plain text) Loading library: DOC (Microsoft Word document format) http://www.test.ru/
Особая прелесть плагинов в том, что вы можете разработать свой плагин, для индексации файлов своего формата. Вы можете написать плагин, позволяющий осуществить поиск по картинкам и т.д.
Разработка плагинов
В дистрибутиве, в каталоге manual находится архив plugin.zip, содержщий исходный текст плагина для обработки текстовых файлов.
Для того, чтобы программа обнаружила плагин, он должен иметь правильное расширение, находится в каталоге с индексатором и содержать следующие функции:
Название функции | Описание функции |
---|---|
char *get_info(void) | Возвращает строку - информацию о плагине (его название) |
char *get_mime(void) | Возвращает строку - список MIME TYPE'ов, которые обрабатывает этот плагин, разделенных вертикальной чертой "|" |
char* get_shortdesc(void) | Возвращает строку - короткое название типа файла (ставится в то место, где у HTML файлов выводится кодировка) |
char* get_title(void) | Возвращает строку - title (Заголовок) документа. Если NULL, то вместо заголовка, будет подставлен URL документа |
TPluginWord* get_word(unsigned char *d, unsigned long filesize) | Основная функция - возвращает указатель на структуру TpluginWord, которая содержит слово, которое необходимо добавить в поисковый индекс. Эта функция должна последовательно вернуть все слова, которые содержит документ.
|
Структура TpluginWord выглядит следующим образом:
typedef struct { char word[32]; int rel; bool end; } TPluginWord;
где
- word - Слово, дополненное справа нулями \0x00. Отсюда видно, что максимальная длина слова - 32 символа.
- rel - относительная релевантность слова. Может изменятся от 1 до 256. Рекомендуется использовать значения от 1 до 4. В примере каждое слово имеет релевантность 1, за исключением слова содержащее одни ЗАГЛАВНЫЕ буквы - его релевантность - 2.
- end - true, если больше нету слов в документе. Если true, то значения word и rel игнорируются.
Теперь немного о том, как основная программа вызывает функции плагинов.
Функции get_info(), get_mime() и get_shortdesc() вызываются один раз, при загрузке плагина. Функция get_title() вызывается один раз для каждого документа, после чего для этого документа вызывается функция get_word() до тех пор, пока поле end структуры TwordPlugin не станет true.
Вообщем, удачи в написании плагинов, если есть какие-либо предложения - пишите.