Конфигурирование источника данных
Основная секция конфигурационного файла источника данных должна содержать следующие директивы.
HostNameИмя хоста или IP адрес SQL-сервера.
BaseNameИмя SQL-базы.
UserИмя пользователя.
Значение по умолчанию: текущий логин.
PasswordПароль для доступа к SQL-серверу
Если Password не задан, то будут проверены только те записи в таблице пользователей, которые не имеют пароля.
UnixSocketНомер unix-сокета.
Значение по умолчанию: не задан.
PortНомер порта.
Значение по умолчанию: не задан.
UrlQuerySQL-запрос, при помощи которого можно получить список всех записей базы данных, подлежащих индексированию. Обычно это оператор SELECT по полю или нескольким полям с неповторяющимися значениями (по первичному ключу, если пользоваться терминологией баз данных).
Примеры. UrlQuery SELECT id FROM mydata - так как результатом этого запроса является совокупность всех записей таблицы по полю id, то проиндексированы будут все данные, содержащиеся в mydata. При этом важно чтобы содержимое поля id было уникально, т.е. зная конкретное значение id, мы должны быть уверены, что ему соответствует одна и только одна запись в данной таблице. Зачем это необходимо, станет понятно позже.
UrlQuery SELECT id,name FROM mydata - то же, что и в первом случае, однако, значения в поле id или в поле name могут повторяться. Но любые их комбинации должны быть уникальны.
UrlQuery SELECT id,name FROM mydata WHERE id - проиндексирована будет лишь та часть таблицы, поле id которой меньше 1000.
DocQuerySQL-запрос для получения конкретной записи базы. Это тоже оператор SELECT, но оформленный таким образом, чтобы в качестве результата запроса возвращался стандартный документ (HTML, например), содержащий запрошенные данные.
Пример: DocQuery SELECT concat( \ 'Content-Type: text/html\n',\ 'Last-Modified: ',m_time,'\n\n',\ '<HTML><HEAD>',\ '<TITLE>',user,'</TITLE>',\ '</HEAD>\n',\ '<BODY>\n',content,'\n</BODY></HTML>'\ ) FROM programs WHERE id=$1 здесь m_time, user, content и id - имена полей таблицы programs.
Из этого примера видно, что ответ SQL-сервера для внешнего получателя (индексатора или поисковика) будет выглядеть как стандартная HTML-страница. Присутствуют все ее атрибуты - HTTP-заголовок (первые две строки, отделенные от основной части документа двумя символами новой строки - "\n\n") и тело документа с необходимым набором тэгов. Непонятным остается только последнее выражение id=$1. Что оно значит, мы объясним ниже.
Redirect Необязательная директива, используется при поиске для вывода ссылки на найденный документ . При отображении ссылки на веб-странице будут подставлены нужные значения полей.
Примеры: Redirect http://www.myhost.ru/cgi-bin/message? Redirect http://www.myhost.ru/cgi-bin/message?id=$1
KeepAliveКлюч дает поисковому серверу команду установить соединение с SQL-сервером при запуске и не закрывать его до завершения работы. Это уменьшает время доступа и повышает производительность системы в целом. По умолчанию соединение с SQL-сервером устанавливается каждый раз при запросе конкретной записи SQL-базы.
HTTP-заголовок может состоять из любых разрешенных данным протоколом модификаторов, но на текущий момент Яndex.Server 3.1 умеет обрабатывать только два их типа: Content-Type и Last-Modified.
- Content-Type может иметь те же значения, что и соответствующий HTTP-заголовок;
- Last-Modified задает любое число, по которому определяется, изменен документ или нет. Если это число больше числа, сохраненного для данного документа в индексе при предыдущем индексировании, документ считается измененным, если нет - неизмененным.
Как уже не раз упоминалось, для хранения всех обработанных документов Яndex.Server 3.1 использует один набор индексных файлов. Это же относится и к данным, полученным из SQL-баз. Они хранятся совместно со всеми остальными. Но, так как в отличие от стандартных HTML-страниц записи базы данных не имеют URL, то этот атрибут формируется искусственно по следующим правилам.
К имени или IP-адресу хоста, на котором находится SQL-сервер (задается ключом HostName - см.
ниже) прибавляются значения полей, указанных в операторе SELECT (ключ UrlQuery), разделенные символом '/' (слеш). В результате этого получается уникальный идентификатор записи в стиле адресов Web, по которому ее однозначно можно определить (вот почему список значений, полученный в результате запроса в UrlQuery, должен состоять из неповторяющихся данных).
Например, ключам: HostName localhost UrlQuery SELECT id,ch_id,name FROM programs при значениях id=11, ch_id=123, name=myprog будет соответствовать такой искусственный URL записи в индексной базе: localhost/00000011/000000123/myprog
Для ускорения индексации все числовые поля при генерации URL'a расширяются слева нулями до максимальной ширины поля.
Вообще вопросам производительности при проектировании Яndex.Server 3.1 уделялось самое пристальное внимание, и разработчики постарались учесть большинство нюансов, влияющих на скорость работы системы. Однако далеко не все зависит от программистов. Большое значение для эффективного функционирования поискового сервера имеет конкретная его конфигурация. Так, например, обработка SQL-базы индексатором может производиться двумя разными способами, целесообразность применения которых зависит от конкретной ситуации:
- для примера, приведенного выше, индексирование напоминает обход сайта по дереву файлов на диске. При этом курсор в SQL-базе перемещается последовательно от записи к записи. В данном случае важно, чтобы список записей базы данных, возвращаемый SQL-сервером в ответ на запрос ключа UrlQuery, был отсортирован по возрастанию. Неотсортированный список приведет к ненужной переиндексации части документов и, соответственно, к падению производительности;
- если по каким-либо причинам воспользоваться первым способом индексации не удается, то можно организовать обход SQL-базы роботом в произвольном порядке. При этом курсор текущей записи будет перемещаться по базе произвольно, и необходимость в сортировке отпадает. Индексатор переходит в данный режим работы, если встречает в SQL-запросе ключ UrlQuery символ '(' UrlQuery SELECT concat(id,'/',ch_id,'/',name) FROM programs
Разница в производительности между оптимальным и неоптимальным способами индексирования на маленьких и средних сайтах будет незаметна, но на серверах, содержащих объемные базы данных, с подобными нюансами приходится считаться.
В процессе индексации значения полей оператора SELECT заносятся в переменные вида $n, где n - порядковый номер поля в операторе SELECT ключа UrlQuery начиная с 1: localhost/00000011/000000123/myprog $1 $2 $3
Для данного примера значение поля id будет содержаться в переменной $1, значение поля ch_id в переменной $2, а значение поля name в переменной $3.
Эти переменные можно свободно использовать при подготовке SQL-запроса для ключа DocQuery. Отсюда выражение id=$1, встретившееся ранее, означает, что у SQL-сервера будут запрошены записи с полем id, равным текущему значению переменной $1.