понедельник, 21 января 2008 г.

Шпаргалка по mnoGoSearch

Недавно мне потребовалось установить у себя поисковый движок для индексирования HTML страничек. Остановился я на mnoGoSearch. В процессе чтения документации я выписывал некоторые моменты, которые могут пригодиться впоследствии, чтобы не пришлось заново копаться в мануалах. В результате получилось что-то вроде небольшой шпаргалки. На случай, если вдруг она кому-нибудь пригодится, выкладываю ее сюда.

indexer -E create - создает все необходимые таблицы в базе данных (предполагается, что сама база данных уже создана).

indexer -E blob - создает индекс по всей проиндексированной информации (необходимо выполнять каждый раз после запуска indexer, если используется способ хранения blob, иначе поиск будет осуществляться только по старой информации, находящейся в базе данных, для которой был ранее выполнен indexer -E blob).

indexer -E wordstat - создает индекс по всем обнаруженным словам. search.cgi использует его при включенной опции Suggest. Если включить данную опцию, то, если поиск не дает результатов, search.cgi будет предлагать варианты правильного написания запроса на случай, если пользователь допустил ошибку.

Документы индексируются только тогда, когда считаются устаревшими. Период устаревания задается опцией Period, которая может быть указана к конфиге несколько раз перед каждым определением URL, который надо индексировать. Если необходимо переиндексировать все документы, игнорируя эту инструкцию, то следует запустить indexer -a.

indexer имеет ключи -t, -g, -u, -s, -y для ограничения работы только с чатью базы ссылок. -t соответсвует ограничению по тэгу, -g соответсвует ограничению по категории, -u - ограничение по части URL (поддерживаются шаблоны SQL LIKE с символами % и _), -s - ограничение по HTTP статусу документа, -y - ограничения по Content-Type. Все ограничения для одного и того же ключа объединяются опрератором ИЛИ, а группы разных ключей - оператором И.

Чтобы очистить всю базу данных, следует использовать команду indexer -C. Также можно удалить только часть базы, используя ключи указания подсекций -t, -g, -u, -s, -y.


Статистика базы данных для SQL серверов

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

Значения кода статуса:
  • 0 - новый (еще ни разу не индексированный) документ
  • Если статус не 0, он равен коду HTTP ответа, некоторые коды ответов HTTP:
  • 200 - "OK" (url успешно проиндексирован)
  • 301 - "Moved Permanently" (переадресован на другой URL)
  • 302 - "Moved Temporarily" (переадресован на другой URL)
  • 303 - "See Other" (переадресован на другой URL)
  • 304 - "Not modified" (url не модифицирован со времени предыдущего индексирования)
  • 401 - "Authorization required" (нужен login/password для этого документа)
  • 403 - "Forbidden" (нет доступа к этому документу)
  • 404 - "Not found" (указаный документ не существует)
  • 500 - "Internal Server Error" (ошибка в cgi, и т.д.)
  • 503 - "Service Unavailable" (Хост недоступен, таймаут соединения)
  • 504 - "Gateway Timeout" (таймаут при получении документа)
Код ответа HTTP 401 обозначает, что документ защищён паролем. Можно использовать команду AuthBasic в indexer.conf для указания login:password для URL.


Проверка ссылок (только для SQL серверов)

Будучи запущенным с ключом -I, indexer показывает пары URL и страница, ссылающаяся на него. Это полезно для поиска битых ссылок на страницах. Также можно использовать ключи ограничений подсекций для этого режима. Например, indexer -I -s 404 покажет адреса всех ненайденных документов вместе с адресами страниц, содержащими ссылки на эти документы.


Параллельное индексирование (только для SQL серверов)

Пользователи MySQL и PostgreSQL могут запускать несколько indexer'ов одновременно с одним и тем же файлом конфигурации indexer.conf. Indexer использует механизм блокировки MySQL и PostgreSQL для избежания двойного индексирования одних и тех же документов разными одновременно работающими indexer'ами. Параллельное индексирование может работать некорректно с остальными поддерживаемыми SQL серверами. Также можно использовать многопоточную версию indexer c любым SQL сервером, поддерживающим параллельные соединения с базой. Многопоточная версия использует свой собственный механизм блокировки.

Не рекомендуется использовать одну и ту же базу с различными файлами конфигурации indexer.conf! Один процесс может добавлять некоторые документы в базу, в то время как другой - удалять эти же документы, и оба могут работать без остановки.

С другой стороны, можно запускать несколько indexer'ов c различными файлами конфигурации и различными базами для любого поддерживаемого SQL сервера.


Реакция на коды HTTP-ответа

Для описания использован псевдо-язык:
  • 200 OK
  • 1. Если указан ключ -m ("force reindex"), то переход к 4. 2. Сравнение новой и старой, сохраненной в БД, контрольных сумм документа 3. Если контрольные суммы равны, то next_index_time = Now() + Period, переход к 7 4. Разбор документа, создание списка слов, добавление в БД новых гипертекстовых ссылок 5. Удаление старого списка слов и секций из БД 6. Вставка нового списка слов и секций 7. Конец
  • 304 Not Modified
  • 1. next_index_time = now() + Period 2. Конец
  • 301 Moved Permanently
  • 302 Moved Temporarily
  • 303 See Other
  • 1. Удаление слов данного документа из БД 2. next_index_time = Now() + Period 3. Добавление в БД URL из заголовка Location: 4. Конец
  • 300 Multiple Choices
  • 305 Use Proxy (proxy redirect)
  • 400 Bad Request
  • 401 Unauthorized
  • 402 Payment Required
  • 403 Forbidden
  • 404 Not found
  • 405 Method Not Allowed
  • 406 Not Acceptable
  • 407 Proxy Authentication Required
  • 408 Request Timeout
  • 409 Conflict
  • 410 Gone
  • 411 Length Required
  • 412 Precondition Failed
  • 413 Request Entity Too Large
  • 414 Request-URI Too Long
  • 415 Unsupported Media Type
  • 500 Internal Server Error
  • 501 Not Implemented
  • 502 Bad Gateway
  • 505 Protocol Version Not Supported
  • 1. Удаление из БД слов документа 2. next_index_time=Now()+Period 3. Конец
  • 503 Service Unavailable
  • 504 Gateway Timeout
  • 1. next_index_time=Now()+Period 2. Конец

Поддержка Content-Encoding

Поисковый движок mnoGoSearch поддерживает сжатие HTTP запросов и ответов (Content encoding). Сжатие запросов и ответов http-сервера позволяет значительно улучшить производительность обработки http-запросов за счет уменьшения объёма передаваемых данных.

Использование сжатия http-запросов позволяет уменьшить трафик в два и более раз.

В спецификации HTTP 1.1 (RFC 2616) определены четыре метода кодирования содержимого ответов сервера: gzip, deflate, compress, и identity.

Если включена поддержка Content-encoding, indexer шлёт http-серверу заголовок Accept-Encoding: gzip,deflate,compress.

Если http-сервер поддерживает любой из методов кодирования gzip, deflate or compress он шлёт ответ, закодированый этим методом.

Для сборки mnoGoSearch с поддержкой сжатия HTTP-запросов, необходимо наличие библиотеки zlib.

Чтобы включить поддержку Content encoding, необходимо сконфигурировать mnoGoSearch с указанием следующего ключа:
./configure --with-zlib


Булев поиск

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

mnoGoSearch понимает следующие булевы операторы:

& - логическое И. Например, mysql & odbc. mnoGoSearch будет искать URL, содержащие оба слова "mysql" и "odbc". Также можно использовать знак + для этого оператора.

| - логическое ИЛИ. Например, mysql | odbc. mnoGoSearch будет искать URL, содержащие или слово "mysql" или слово "odbc".

~ - логическое НЕ. Например, mysql & ~odbc. mnoGoSearch будет искать URL, содержащие слово "mysql" и в тоже время не содержащие слово "odbc". Внимание! ~ всего лишь исключает некоторые документы из результата поиска. Запрос "~odbc" ничего не найдёт!

() - оператор группирования для создания более сложных запросов поиска. Например, (mysql | msql) & ~postgres.

" - оператор выделения фраз. Например, "russian apache" & "web server". Также можно использовать знак ' для этого оператора.

2 комментария:

Анонимный комментирует...

оффтоп - а как сделать в blogpost - "читать полностью"

Dmitry Konishchev комментирует...

Вот так.