5.6. Внешние источники данных

5.6.1. Индексирование баз данных MySQL (Unix)

5.6.1.1. Конфигурационный файл индексатора

Индексирование 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 - произвольное имя конфигурационного файла для источника данных. Ниже в этом разделе мы рассмотрим директивы этого конфигурационного файла.

5.6.1.2. Конфигурирование источника данных

Основная секция конфигурационного файла источника данных должна содержать следующие директивы.

HostName

Имя хоста или IP адрес SQL-сервера.

BaseName

Имя SQL-базы.

User

Имя пользователя.

Значение по умолчанию: текущий логин.

Password

Пароль для доступа к SQL-серверу

Если Password не задан, то будут проверены только те записи в таблице пользователей, которые не имеют пароля.

UnixSocket

Номер unix-сокета.

Значение по умолчанию: не задан.

Port

Номер порта.

Значение по умолчанию: не задан.

UrlQuery

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.

DocQuery

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

Необязательная директива, используется при поиске для вывода ссылки на найденный документ . При отображении ссылки на веб-странице будут подставлены нужные значения полей.

Примеры:

  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.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.

5.6.1.3. Механизм взаимодействия Яndex.Server 3.4 с SQL-сервером

Обобщим все вышесказанное и кратко опишем ключевые моменты механизма взаимодействия Я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 как шаблоном, генерировать результирующие документы.

5.6.1.4. Пример файла конфигурации для индексирования и поиска по MySQL-базе.

Содержимое файла 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-сервера данных вы можете свободно управлять.

5.6.1.5. Секция Dump

Конфигурационный файл источника данных может содержать необязательную секцию 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>'.

5.6.2. Индексирование данных через интерфейс OLEDB (Windows)

Для работы модуля, описываемого в этом разделе, на компьютере должны быть установлены Microsoft Data Access Components (MDAC) версии не ниже 2.7. Последнюю версию MDAC можно скачать с http://www.microsoft.com/data/download.htm.

5.6.2.1. Конфигурационный файл индексатора

Индексирование баз данных через интерфейс OLEDB реализовано в Яndex.Server 3.4 посредством специального модуля связи с источником данных, который находится в файле oledb.dll. Поэтому для индексирования OLEDB-данных в конфигурационном файле индексатора надо задать хотя бы одну секцию следующего вида (см. раздел Секция DataSource).

  <DataSource>
      Name: mydata
      Module: oledb.dll
      Config: sqldb.cfg
  <DataSource>

Здесь mydata - произвольный идентификатор, отличающий один источник данных от другого, а sqldb.cfg - произвольное имя конфигурационного файла для источника данных. Ниже в этом разделе мы рассмотрим директивы этого конфигурационного файла.

5.6.2.2. Конфигурирование источника данных

Основная секция конфигурационного файла источника данных должна содержать следующие директивы.

Provider

Задает идентификатор драйвера, который будет использоваться для доступа к данным. Например, драйверу "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

DataSource

Имя или IP-адрес компьютера, на котором установлен сервер базы данных

Пример:

  DataSource = MYSQLSERVER

Catalog

Имя базы данных на сервере баз данных.

Пример:

  Catalog = mydatabase

UserId

Идентификатор пользователя с правами на чтение базы данных.

Пример:

  UserId = mylogin

Password

Пароль пользователя.

Пример:

  Password = mypassword

5.6.2.3. Конфигурирование шаблона документа

Конфигурационный файл источника данных должен содержать не менее одной секции, описывающей соответствие между индексируемыми документами и записями базы данных. Каждая секция должна иметь произвольное, но уникальное имя, отличающее ее от других секций. В секции могут быть заданы следующие директивы.

UrlQuery

SQL-запрос, при помощи которого можно получить список всех записей базы данных, подлежащих индексированию. Обычно это оператор SELECT по полю или нескольким полям с неповторяющимися значениями (по первичному ключу, если пользоваться терминологией баз данных).

Пример.

  UrlQuery: SELECT id FROM mydata
Так как результатом этого запроса является совокупность всех записей таблицы по полю id, будут проиндексированы все данные, содержащиеся в mydata. При этом важно, чтобы содержимое поля id было уникально.
  UrlQuery : SELECT id FROM mydata WHERE id<1000
Будет проиндексирована лишь та часть таблицы, поле id которой меньше 1000.

KeyFields

Список имен полей, формирующих первичный ключ в наборе записей, полученном с помощью UrlQuery. Каждому документу, соответствующему одной записи, в индексе будет сопоставлен URL, компонетами которого являются значение директивы Name секции DataSource конфигурационного файла индексатора, имя секции конфигурационного файла источника данных, в которой описывается данный шаблон документа, значения полей, указанных в директиве KeyFields.

Пример:

  KeyFields: id

DocQuery

SQL-запрос для получения конкретной записи базы. Запрос должен быть оформлен таким образом, чтобы в качестве результата запроса возвращалась ровно одна запись, содержащая данные для формирования документа. В запросе следует употребить параметры с именами $1-$N, где $k - порядковый номер поля в директиве KeyFields

Пример:

  DocQuery: SELECT id, m_time, title, content FROM mydata WHERE id=$1
Здесь m_time, title, content - имена полей таблицы mydata.

IndexFields

Список имен полей в наборе записей, полученном с помощью DocQuery, которые содержат данные документа. Значения этих полей будут подставлены в шаблон документа.

Пример:

  IndexFields: id, title, content

TimeStamp

Необязательная директива. Имя поля из набора записей, полученного с помощью DocQuery, в котором содержатся данные, имеющие смысл времени последнего обновления записи. Если задано, будет возможна ускоренная переиндексация.

Пример:

  TimeStamp: m_time

Template

Указывает путь к файлу с шаблоном документа. В шаблоне следует употребить параметры с именами $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>
      

MimeType

Необязательная директива. Указывает формат документа, генерируемого с помощью шаблона Template. Формат документа должен совпадать с одним из форматов, определенных в секциях DocFormat

Значение по умолчанию: text/html

Redirect

Необязательная директива, используется при поиске для вывода ссылки на найденный документ. Если отсутствует, будет показана ссылка на внутренний скрипт, выводящий документ по шаблону, указанному в Template. Значение директивы представляет собой адрес серверного скрипта с CGI-параметрами, вместо значений которых указаны параметры с именами $1-$N, где $k - порядковый номер поля в директиве KeyFields. При отображении ссылки на веб-странице будут подставлены нужные значения полей.

Пример:

  Redirect: http://myserver.ru/script.asp?id=$1

5.6.2.4. Конфигурирование группировочных соответствий

Конфигурационный файл источника данных может содержать необязательную секцию 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.2.5. Индексирование книжного магазина

Пример 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[Пушкин]

5.6.3. Индексирование данных через интерфейс ODBC (Unix)

Для работы модуля, описываемого в этом разделе, на компьютере должен быть установлен один из ODBC менеджеров: unixODBC или iODBC и ODBC драйвер для нужной базы данных, например MyODBC для MySQL или odbc-postgresql для PostgreSQL.

5.6.3.1. Конфигурационный файл индексатора

Индексирование баз данных через интерфейс ODBC реализовано в Яndex.Server 3.4 посредством специального модуля связи с источником данных, который находится в файле libydodbc.so. Поэтому для индексирования ODBC-данных в конфигурационном файле индексатора надо задать хотя бы одну секцию следующего вида (см. раздел Секция DataSource).

  <DataSource>
      Name    mydata
      Module  libydodbc.so
      Config  sqldb.cfg
  <DataSource>

Здесь mydata - произвольный идентификатор, отличающий один источник данных от другого, а sqldb.cfg - произвольное имя конфигурационного файла для источника данных. Ниже в этом разделе мы рассмотрим директивы этого конфигурационного файла.

5.6.3.2. Конфигурирование источника данных

Основная секция конфигурационного файла источника данных должна содержать следующие директивы.

DataSourceName

Задает идентификатор драйвера, который будет использоваться для доступа к данным. Должен совпадать с одним из заданных в локальном файле настроек ODBC ~/.odbc.ini либо в системной файле /etc/odbc.ini (возможно в вашем случае этот файл должен быть задан переменной среды окружения ODBCINI).

Пример:

  DataSourceName: PostgreSQL

UserName

Необязательная директива. Идентификатор пользователя с правами на чтение базы данных.

Пример:

  UserName: mylogin

Password

Необязательная директива. Пароль пользователя.

Пример:

  Password: mypassword

UrlQuery

SQL-запрос, при помощи которого можно получить список всех записей базы данных, подлежащих индексированию. Обычно это оператор SELECT по полю или нескольким полям с неповторяющимися значениями (по первичному ключу, если пользоваться терминологией баз данных).

Пример:

  UrlQuery: SELECT id FROM mydata
Так как результатом этого запроса является совокупность всех записей таблицы по полю id, будут проиндексированы все данные, содержащиеся в таблице mydata. При этом важно, чтобы содержимое поля id было уникально.
  UrlQuery : SELECT id FROM mydata WHERE id<1000
Будет проиндексирована лишь та часть таблицы, поле id которой меньше 1000.

DocQuery

SQL-запрос для получения конкретной записи базы. Запрос должен быть оформлен таким образом, чтобы в качестве результата запроса возвращалась ровно одна запись, содержащая данные для формирования документа. В запросе следует употребить параметры с именами $1-$N, где $k - порядковый номер поля в директиве UrlQuery

Пример:

  DocQuery: SELECT id, m_time, title, content FROM mydata WHERE id=$1
Здесь id, m_time, title, content - имена полей таблицы mydata.

TimeStamp

Необязательная директива. Имя поля или шаблон, задающий номер поля из набора записей, полученного с помощью DocQuery, в котором содержатся данные, имеющие смысл времени последнего обновления записи. Если задано, будет возможна ускоренная переиндексация.

Примеры:

  TimeStamp: m_time
  TimeStamp: $2
Если директива DocQuery имеет значение
  DocQuery: SELECT id, m_time, title, content FROM mydata WHERE id=$1
то шаблон $2 определяет второе поле из запроса, т.е.поле m_time.

Template

Указывает путь к файлу с шаблоном документа. В шаблоне следует употребить параметры с именами $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>
      

MimeType

Необязательная директива. Указывает формат документа, генерируемого с помощью шаблона Template. Формат документа должен совпадать с одним из форматов, определенных в секциях DocFormat

Значение по умолчанию: text/html

Redirect

Необязательная директива, используется при поиске для вывода ссылки на найденный документ. Если отсутствует, будет показана ссылка на внутренний скрипт, выводящий документ по шаблону, указанному в Template. Значение директивы представляет собой адрес серверного скрипта с CGI-параметрами, вместо значений которых указаны параметры с именами $1-$N, где $k - порядковый номер поля в директиве UrlQuery. При отображении ссылки на веб-странице будут подставлены нужные значения полей.

Пример:

  Redirect: http://myserver.ru/script.asp?id=$1

5.6.3.3. Конфигурирование группировочных соответствий

Конфигурационный файл источника данных может содержать необязательную секцию 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.

5.6.3.4. Пример файла конфигурации для индексирования и поиска по MySQL-базе с использованием драйвера MyODBC.

В конфигурационном файле индексатора задаем секцию 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>

Copyright © 1997 – 2005 «Яндекс»