Индексирование MySQL баз данных реализовано в Яndex.Server 3.4 посредством специального модуля связи с источником данных, который находится в файле ypmysql.dll для Windows и libydmysql.so для Unix. Поэтому для индексирования MySQL-данных в конфигурационном файле индексатора надо задать хотя бы одну секцию следующего вида (см. раздел Секция DataSource).
<DataSource>
Name mysqldata
Module ypmysql.dll
Config mysql_datasrc.cfg
<DataSource>Здесь mysqldata - произвольный идентификатор, отличающий один источник данных от другого, а mysql_datasrc.cfg - произвольное имя конфигурационного файла для источника данных. Ниже в этом разделе мы рассмотрим директивы этого конфигурационного файла.
Основная секция конфигурационного файла источника данных должна содержать следующие директивы.
Имя хоста или IP адрес SQL-сервера.
Имя SQL-базы.
Имя пользователя.
Значение по умолчанию: текущий логин.
Пароль для доступа к SQL-серверу
Если Password не задан, то будут проверены только те записи в таблице пользователей, которые не имеют пароля.
Номер unix-сокета.
Значение по умолчанию: не задан.
Номер порта.
Значение по умолчанию: не задан.
SQL-запрос, при помощи которого можно получить список всех записей базы данных, подлежащих индексированию. Обычно это оператор 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<1000- проиндексирована будет лишь та часть таблицы, поле id которой меньше 1000.
SQL-запрос для получения конкретной записи базы. Это тоже оператор 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 http://www.myhost.ru/cgi-bin/message? Redirect http://www.myhost.ru/cgi-bin/message?id=$1
Ключ дает поисковому серверу команду установить соединение с SQL-сервером при запуске и не закрывать его до завершения работы. Это уменьшает время доступа и повышает производительность системы в целом. По умолчанию соединение с SQL-сервером устанавливается каждый раз при запросе конкретной записи SQL-базы.
HTTP-заголовок может состоять из любых разрешенных данным протоколом модификаторов, но на текущий момент Яndex.Server 3.4 умеет обрабатывать только два их типа: Content-Type и Last-Modified.
Content-Type может иметь те же значения, что и соответствующий HTTP-заголовок;
Last-Modified задает любое число, по которому определяется, изменен документ или нет. Если это число больше числа, сохраненного для данного документа в индексе при предыдущем индексировании, документ считается измененным, если нет - неизмененным.
Как уже не раз упоминалось, для хранения всех обработанных документов Яndex.Server 3.4 использует один набор индексных файлов. Это же относится и к данным, полученным из 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.4 уделялось самое пристальное внимание, и разработчики постарались учесть большинство нюансов, влияющих на скорость работы системы. Однако далеко не все зависит от программистов. Большое значение для эффективного функционирования поискового сервера имеет конкретная его конфигурация. Так, например, обработка 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.
Обобщим все вышесказанное и кратко опишем ключевые моменты механизма взаимодействия Яndex.Server 3.4 с SQL-сервером:
индексация информации из базы данных организуется при помощи двух SQL-запросов, определенных в ключах UrlQuery и DocQuery. Используя ключ UrlQuery, индексатор имеет возможность получить список всех записей, подлежащих индексации, а используя DocQuery - конкретную запись из этого списка.
Ключ DocQuery оформляется таким образом, чтобы возвращать данные в одном из стандартных форматов. Это необязательно должен быть HTML-документ, как в рассмотренных ранее примерах. Данные допустимо оформить в виде text/plain или можно использовать любой другой формат, известный индексатору (подробнее см. ниже).
Индексатор получает информацию и обрабатывает ее обычным образом. В качестве ссылки на исходный документ в индексный файл записывается искусственный URL.
Поисковый сервер производит стандартный поиск по ключевому слову и подготавливает обычную страницу результатов. Она в качестве ссылок на найденные документы содержит URL'ы, сформированные по определенным правилам, которые должны уметь правильно интерпретировать процедуры, отвечающие за извлечение данных из SQL-базы.
В качестве средств для доступа к SQL-серверу и выдачи найденного документа могут быть использованы как скрипты, написанные администратором Яndex.Server 3.4, так и сам поисковый сервер, настроенный соответствующим образом:
если для извлечения из базы данных информации и формирования на ее основе исходного документа вы используете свой CGI-скрипт, то в конфигурационном файле поискового сервера необходимо правильно оформить ключ Redirect.
Пример.
Для выдачи найденного документа используется CGI-скрипт message. Допустим, ключи HostName и UrlQuery для вашей базы выглядят следующим образом:
HostName localhost UrlQuery SELECT id,name FROM programsтогда в настройках поискового сервера должна быть следующая запись:
Redirect http://www.myhost.ru/cgi-bin/message?
В этом случае URL для записи с id=1 и name=user1 на странице результатов поиска будет выглядеть следующим образом:
http://www.myhost.ru/cgi-bin/message?/0001/user1
Это значит, что при использовании своего CGI-скрипта для выдачи искомого документа он в качестве параметров получит строку /0001/user1, которую необходимо обработать и на ее основе сформировать корректный SQL-запрос к базе.
Для тех случаев, когда работать со строкой /0001/user1 не очень удобно, существует альтернативный вариант задания ключа Redirect - с использованием переменных $n. Если ключ имеет вид:
Redirect http://www.myhost.ru/cgi-bin/message?id=$1&name=$2будет сформирован так:
http://www.myhost.ru/cgi-bin/message?id=0001&name=user1и скрипт message получит строку параметров стандартного для CGI формата. С данными в таком виде гораздо проще работать, особенно если приходится адаптировать уже существующие процедуры под новые возможности Яndex.Server 3.4.
Эти изменения позволяют задействовать внутренние механизмы Яndex.Server 3.4, обычно используемые для получения подсвеченных документов. В результате поисковик будет сам формировать необходимые SQL-запросы к базе, получать требуемые данные и, пользуясь содержимым ключа DocQuery как шаблоном, генерировать результирующие документы.
Содержимое файла mysql_datasrc.cfg может быть таким:
KeepAlive yes
HostName localhost
BaseName mydb
User search_user
Password search_user_pass
UrlQuery SELECT id,ch_id FROM programs
DocQuery SELECT concat( \
'Content-Type: text/html\n',\
'Last-Modified: ',UNIX_TIMESTAMP(m_time),'\n\n',\
'<HTML><HEAD>',\
'<TITLE>',user,'</TITLE>',\
'<META NAME="Description" Content="',pr_name,' ',pr_descr,'">',\
'</HEAD>\n',\
'<BODY>\n',content,'\n</BODY></HTML>'\
) FROM programs WHERE id=$1
! где UNIX_TIMESTAMP(m_time) - время модификации записи в секундах;
! user, pr_name, pr_descr, content - индексируемые поля SQL-базы,
! из которых генерируется html-документ.В данном примере для каждой записи MySQL-базы генерируется HTML-документ. Это видно по содержимому ключа DocQuery. В нем определен медиа тип text/html. Кроме того, обратите внимание на то, что для получения списка индексируемых записей в UrlQuery используется два поля базы данных (id и ch_id), а для формирования результирующего документа задействовано лишь одно из них (id=$1). На первый взгляд кажется, что второй параметр здесь лишний. И в данном случае это действительно так.
Однако часто встречаются ситуации, в которых без дополнительной информации из SQL-базы не обойтись. Например, на вашем сайте размещена программа телепередач, и вы организовали поиск по ней. Для наглядности страницу с результатами поиска вы хотите оформить так, чтобы рядом с названием передачи выдавалась иконка канала, на котором она будет идти. Имя этой иконки очень удобно передавать через дополнительный параметр (в $2). Подобное возможно, т.к. переменные вида $n (в которые заносятся текущие значения полей ключа UrlQuery) можно использовать не только для формирования внешнего вида исходного документа (в ключе DocQuery), но и при подготовке дизайна страницы результатов поиска.
Ранее мы неоднократно упоминали, что результирующий документ не обязательно должен являться HTML-страницей. Данные из базы могут быть представлены в любом другом формате. Вот, например, как можно представить найденную информацию в текстовом виде (медиа-тип text/plain):
DocQuery SELECT concat( \
'Content-Type: text/plain\n',\
'Last-Modified: ',UNIX_TIMESTAMP(m_time),'\n\n',\
content) FROM programs WHERE id=$1Таким образом, внешним представлением поступающих от SQL-сервера данных вы можете свободно управлять.
Конфигурационный файл источника данных может содержать необязательную секцию Dump, предназначенную для автоматического создания группировочных файлов c2n и c2p. Эта секция содержит несколько директив, по числу файлов, которые надо создать.
Ключом каждой директивы служит имя файла, а значение определяет SQL-запрос, результатом которого должен быть набор записей из двух полей. Файлы будут созданы в той же директории, что и остальные индексные файлы.
Например:
Dump.channels.c2n SELECT id,name FROM channels Dump.channels.c2p SELECT id,region FROM channelsПри такой записи будут созданы два файла channels.c2n и channels.c2p, в первом будут записи вида <id>\t<name>', во втором <id>\t<region>'.
Для работы модуля, описываемого в этом разделе, на компьютере должны быть установлены Microsoft Data Access Components (MDAC) версии не ниже 2.7. Последнюю версию MDAC можно скачать с http://www.microsoft.com/data/download.htm.
Индексирование баз данных через интерфейс OLEDB реализовано в Яndex.Server 3.4 посредством специального модуля связи с источником данных, который находится в файле oledb.dll. Поэтому для индексирования OLEDB-данных в конфигурационном файле индексатора надо задать хотя бы одну секцию следующего вида (см. раздел Секция DataSource).
<DataSource>
Name: mydata
Module: oledb.dll
Config: sqldb.cfg
<DataSource>Здесь mydata - произвольный идентификатор, отличающий один источник данных от другого, а sqldb.cfg - произвольное имя конфигурационного файла для источника данных. Ниже в этом разделе мы рассмотрим директивы этого конфигурационного файла.
Основная секция конфигурационного файла источника данных должна содержать следующие директивы.
Задает идентификатор драйвера, который будет использоваться для доступа к данным. Например, драйверу "Microsoft OLE DB Provider for SQL Server" соответствует идентификатор SQLOLEDB.1, драйверу "Microsoft OLE DB Provider for ODBC Drivers" - идентификатор MSDASQL.1, а драйверу "Microsoft OLE DB Provider for Oracle" - идентификатор MSDAORA.1.
Существует специальное значение prompt, при задании которого индексатор показывает стандартное диалоговое окно настройки доступа к базе данных и ожидает от пользователя его закрытия. В этом случае остальные директивы, описанные в этом разделе, игнорируются. Если индексатор работает в режиме системного сервиса, в настройках сервиса необходимо разрешить взаимодействие с десктопом.
Пример:
Provider = SQLOLEDB.1
Имя или IP-адрес компьютера, на котором установлен сервер базы данных
Пример:
DataSource = MYSQLSERVER
Имя базы данных на сервере баз данных.
Пример:
Catalog = mydatabase
Идентификатор пользователя с правами на чтение базы данных.
Пример:
UserId = mylogin
Пароль пользователя.
Пример:
Password = mypassword
Конфигурационный файл источника данных должен содержать не менее одной секции, описывающей соответствие между индексируемыми документами и записями базы данных. Каждая секция должна иметь произвольное, но уникальное имя, отличающее ее от других секций. В секции могут быть заданы следующие директивы.
SQL-запрос, при помощи которого можно получить список всех записей базы данных, подлежащих индексированию. Обычно это оператор SELECT по полю или нескольким полям с неповторяющимися значениями (по первичному ключу, если пользоваться терминологией баз данных).
Пример.
UrlQuery: SELECT id FROM mydataТак как результатом этого запроса является совокупность всех записей таблицы по полю id, будут проиндексированы все данные, содержащиеся в mydata. При этом важно, чтобы содержимое поля id было уникально.
UrlQuery : SELECT id FROM mydata WHERE id<1000Будет проиндексирована лишь та часть таблицы, поле id которой меньше 1000.
Список имен полей, формирующих первичный ключ в наборе записей, полученном с помощью UrlQuery. Каждому документу, соответствующему одной записи, в индексе будет сопоставлен URL, компонетами которого являются значение директивы Name секции DataSource конфигурационного файла индексатора, имя секции конфигурационного файла источника данных, в которой описывается данный шаблон документа, значения полей, указанных в директиве KeyFields.
Пример:
KeyFields: id
SQL-запрос для получения конкретной записи базы. Запрос должен быть оформлен таким образом, чтобы в качестве результата запроса возвращалась ровно одна запись, содержащая данные для формирования документа. В запросе следует употребить параметры с именами $1-$N, где $k - порядковый номер поля в директиве KeyFields
Пример:
DocQuery: SELECT id, m_time, title, content FROM mydata WHERE id=$1Здесь m_time, title, content - имена полей таблицы mydata.
Список имен полей в наборе записей, полученном с помощью DocQuery, которые содержат данные документа. Значения этих полей будут подставлены в шаблон документа.
Пример:
IndexFields: id, title, content
Необязательная директива. Имя поля из набора записей, полученного с помощью DocQuery, в котором содержатся данные, имеющие смысл времени последнего обновления записи. Если задано, будет возможна ускоренная переиндексация.
Пример:
TimeStamp: m_time
Указывает путь к файлу с шаблоном документа. В шаблоне следует употребить параметры с именами $1-$N, где $k - порядковый номер поля в директиве IndexFields. В процессе индексирования будут подставлены значения для текущей записи.
Пример:
Template: c:\mydoc.htmФайл c:\mydoc.htm имеет следующий вид:
<HTML>
<HEAD>
<META NAME="docid" CONTENT="$1">
<TITLE>$2</TITLE>
</HEAD>
<BODY>$3</BODY>
</HTML>
Необязательная директива. Указывает формат документа, генерируемого с помощью шаблона Template. Формат документа должен совпадать с одним из форматов, определенных в секциях DocFormat
Значение по умолчанию: text/html
Необязательная директива, используется при поиске для вывода ссылки на найденный документ. Если отсутствует, будет показана ссылка на внутренний скрипт, выводящий документ по шаблону, указанному в Template. Значение директивы представляет собой адрес серверного скрипта с CGI-параметрами, вместо значений которых указаны параметры с именами $1-$N, где $k - порядковый номер поля в директиве KeyFields. При отображении ссылки на веб-странице будут подставлены нужные значения полей.
Пример:
Redirect: http://myserver.ru/script.asp?id=$1
Конфигурационный файл источника данных может содержать необязательную секцию Dump, предназначенную для автоматического создания группировочных файлов c2n и c2p (см. обсуждение в разделе Группировочные атрибуты). Эта секция содержит несколько директив, по числу файлов, которые надо создать.
Ключем каждой директивы служит имя файла, а значение состоит из трех полей, разделенных символом /. В первом поле задается SQL-запрос, результатом которого должен быть набор записей из двух полей, а в двух других - названия этих полей. Файлы будут созданы в той же директории, что и остальные индексные файлы.
Пример:
cat.c2n = SELECT catid, category FROM categories/catid/category cat.c2p = SELECT catid, owner FROM categories/catid/ownerПри такой записи будут созданы два файла cat.c2n и cat.c2p, в первом будут записи <catid>\t<category>\n, во втором <catid>\t<owner>\n.
Пример 5-6. Конфигурация OLEDB-источника данных
Ниже приведена настройка индексирования, которую можно было бы использовать для индексирования книжного магазина. Предположим, что база данных магазина поддерживается MSSQL-сервером на компьютере BOOKDB в каталоге bookshop, который состоит из трех таблиц. Первая таблица books описывает книги и содержит следующие поля.
bookid ;идентификатор книги authorid ;идентификатор автора catid ;идентификатор темы title ;название книги description ;краткое содержаниеВторая таблица authors описывает авторов и содержит следующие поля.
authorid ;идентификатор автора author ;имя автора biograph ;биография автораТретья таблица categories описывает многоуровневый тематический каталог и содержит следующие поля.
catid ;идентификатор темы owner ;идентификатор темы верхнего уровня из этой же таблицы category ;название темыИдентификаторы в таблицах являются числами, остальные поля содержат обычный текст без форматирования.
Конфигурационный файл индексатора включает в себя следущую секцию.
<DataSource>
Name: books
Module: oledb.dll
Config: sqldb.cfg
Options: IndexNofollow UrlCaseFold
</DataSource>
При поиске мы хотим сгруппировать результаты по темам книжного каталога, поэтому добавим в
конфигурацию следующую директиву:
Groups: catЭта директива позволит автоматически создать файлы группировочных атрибутов в процессе индексирования документов, однако для этого надо определить документный атрибут cat, то есть настроить парсер:
<DocFormat>
MimeType: text/html
Config: html.cfg
</DocFormat>Конфигурационный файл источника данных sqldb.cfg имеет следующий вид.
provider = SQLOLEDB.1
datasource = BOOKDB
catalog = bookshop
userid = *****
password = *****
<!-- автоматически создадим файлы для группировочного атрибута -->
<Dump>
cat.c2n = SELECT catid, category FROM categories/catid/category
cat.c2p = SELECT catid, owner FROM categories/catid/owner
</Dump>
<!-- определим шаблон документов для индексирования, каждый документ соответствует одной книге -->
<book>
urlquery = SELECT bookid FROM books ORDER BY 1
keyfields = bookid
docquery = SELECT b.catid, b.title, b.description, a.author, c.category \
FROM books b, authors a, categories c \
WHERE b.catid = c.catid AND b.authorid = a.authorid AND b.bookid = $1
indexfields = catid, title, description, author, category
template = c:\yandexsite\book.htm
</book>Файл c:\yandexsite\book.htm шаблона документа, представляющего одну книгу, имеет следующий вид.
<HTML> <HEAD> <META NAME="catid" CONTENT="$1"> </HEAD> <BODY> <H1>$2</H1> <H2>$4</H2> <H3>$5</H3> <P>$3</P> </BODY> </HTML>
Конфигурационный файл парсера html.cfg имеет следующий вид (см. раздел Конфигурация HTML-парсера).
<Zones>
title H1
author H2
category H3
description P
</Zones>
<Attributes>
cat INTEGER/meta.catid
</Attributes>
Так как документ разбит на несколько поисковых зон, книги можно искать как по полному
описанию, так и независимо по названиям, авторам, описаниям, категориям каталога.
Например, найдем произведения Пушкина, в описании которых встречается слово
сказка:
description[сказка] && author[Пушкин]
Для работы модуля, описываемого в этом разделе, на компьютере должен быть установлен один из ODBC менеджеров: unixODBC или iODBC и ODBC драйвер для нужной базы данных, например MyODBC для MySQL или odbc-postgresql для PostgreSQL.
Индексирование баз данных через интерфейс ODBC реализовано в Яndex.Server 3.4 посредством специального модуля связи с источником данных, который находится в файле libydodbc.so. Поэтому для индексирования ODBC-данных в конфигурационном файле индексатора надо задать хотя бы одну секцию следующего вида (см. раздел Секция DataSource).
<DataSource>
Name mydata
Module libydodbc.so
Config sqldb.cfg
<DataSource>Здесь mydata - произвольный идентификатор, отличающий один источник данных от другого, а sqldb.cfg - произвольное имя конфигурационного файла для источника данных. Ниже в этом разделе мы рассмотрим директивы этого конфигурационного файла.
Основная секция конфигурационного файла источника данных должна содержать следующие директивы.
Задает идентификатор драйвера, который будет использоваться для доступа к данным. Должен совпадать с одним из заданных в локальном файле настроек ODBC ~/.odbc.ini либо в системной файле /etc/odbc.ini (возможно в вашем случае этот файл должен быть задан переменной среды окружения ODBCINI).
Пример:
DataSourceName: PostgreSQL
Необязательная директива. Идентификатор пользователя с правами на чтение базы данных.
Пример:
UserName: mylogin
Необязательная директива. Пароль пользователя.
Пример:
Password: mypassword
SQL-запрос, при помощи которого можно получить список всех записей базы данных, подлежащих индексированию. Обычно это оператор SELECT по полю или нескольким полям с неповторяющимися значениями (по первичному ключу, если пользоваться терминологией баз данных).
Пример:
UrlQuery: SELECT id FROM mydataТак как результатом этого запроса является совокупность всех записей таблицы по полю id, будут проиндексированы все данные, содержащиеся в таблице mydata. При этом важно, чтобы содержимое поля id было уникально.
UrlQuery : SELECT id FROM mydata WHERE id<1000Будет проиндексирована лишь та часть таблицы, поле id которой меньше 1000.
SQL-запрос для получения конкретной записи базы. Запрос должен быть оформлен таким образом, чтобы в качестве результата запроса возвращалась ровно одна запись, содержащая данные для формирования документа. В запросе следует употребить параметры с именами $1-$N, где $k - порядковый номер поля в директиве UrlQuery
Пример:
DocQuery: SELECT id, m_time, title, content FROM mydata WHERE id=$1Здесь id, m_time, title, content - имена полей таблицы mydata.
Необязательная директива. Имя поля или шаблон, задающий номер поля из набора записей, полученного с помощью DocQuery, в котором содержатся данные, имеющие смысл времени последнего обновления записи. Если задано, будет возможна ускоренная переиндексация.
Примеры:
TimeStamp: m_time
TimeStamp: $2Если директива DocQuery имеет значение
DocQuery: SELECT id, m_time, title, content FROM mydata WHERE id=$1то шаблон $2 определяет второе поле из запроса, т.е.поле m_time.
Указывает путь к файлу с шаблоном документа. В шаблоне следует употребить параметры с именами $1-$N, где $k - порядковый номер поля в директиве DocQuery. В процессе индексирования будут подставлены значения для текущей записи.
Пример:
Template: doc.templateФайл doc.template имеет следующий вид:
<HTML>
<HEAD>
<META NAME="pr_name" CONTENT="$1">
<META NAME="Description" Content="$2">
</HEAD>
<BODY>
<H1>$3</H1>
</BODY>
</HTML>
Чтобы задать в шаблоне '$', напишите его дважды. Пример:
<HTML>
<BODY>
<H1>$3</H1>
$$ - это знак доллара
</BODY>
</HTML>
Необязательная директива. Указывает формат документа, генерируемого с помощью шаблона Template. Формат документа должен совпадать с одним из форматов, определенных в секциях DocFormat
Значение по умолчанию: text/html
Необязательная директива, используется при поиске для вывода ссылки на найденный документ. Если отсутствует, будет показана ссылка на внутренний скрипт, выводящий документ по шаблону, указанному в Template. Значение директивы представляет собой адрес серверного скрипта с CGI-параметрами, вместо значений которых указаны параметры с именами $1-$N, где $k - порядковый номер поля в директиве UrlQuery. При отображении ссылки на веб-странице будут подставлены нужные значения полей.
Пример:
Redirect: http://myserver.ru/script.asp?id=$1
Конфигурационный файл источника данных может содержать необязательную секцию Dump, предназначенную для автоматического создания группировочных файлов c2n и c2p (см. обсуждение в разделе Группировочные атрибуты). Эта секция содержит несколько директив, по числу файлов, которые надо создать.
Ключом каждой директивы служит имя файла, а значение определяет SQL-запрос, результатом которого должен быть набор записей из двух полей. Файлы будут созданы в той же директории, что и остальные индексные файлы.
Пример:
cat.c2n = SELECT catid, category FROM categories cat.c2p = SELECT catid, owner FROM categoriesПри такой записи будут созданы два файла cat.c2n и cat.c2p, в первом будут записи <catid>\t<category>\n, во втором <catid>\t<owner>\n.
В конфигурационном файле индексатора задаем секцию DataSource следующего вида (см. раздел Секция DataSource).
<DataSource>
Name mysql_datasrc
Module libydodbc.so
Config mysql_datasrc.cfg
<DataSource>
Здесь mysql_datasrc - произвольный идентификатор,
определяющи имя источника данных, а mysql_datasrc.cfg - имя
конфигурационного файла для источника данных.Содержимое файла mysql_datasrc.cfg может быть таким:
KeepAlive yes DataSourceName MySQL BaseName mydb User search_user Password search_user_pass UrlQuery SELECT id,ch_id FROM programs DocQuery SELECT pr_name, pr_descr, content, m_time FROM programs WHERE id=$1 TimeStamp m_time Template doc.template MimeType text/html
Файл doc.template шаблона документа имеет следующий вид.
<HTML> <HEAD> <META NAME="pr_name" CONTENT="$1"> <META NAME="Description" Content="$2"> </HEAD> <BODY> <H1>$3</H1> </BODY> </HTML>
| Пред. | Начало | След. |
| Парсеры документных форматов | Уровень выше | Группировочные атрибуты |