ВебмастерМетрикаВиджетыРекламная сетьДиректПоиск для сайтаAPI
Войти

Руководство по установке и эксплуатации

В формате PDF

Формирование страниц с результатами поиска

Механизм взаимодействия с поисковым сервером

Поисковый модуль ожидает поступления HTTP-запросов по указанному в конфигурации сервера порту. Сервер анализирует запрошенные URL, а именно путь (abs_path в терминах RFC 2616, часть URL до знака вопроса) и запрос (query, часть URL после знака вопроса, содержащую значения полей поисковой формы), выполняя перечисленные ниже действия в указанном порядке.

  • Анализируется путь запрошенного URL.
    • Если путь совпадает со строкой "/admin", сервер выдает административную страницу.
    • Если путь начинается с подстроки "/images/", сервер выдает статическую картинку.
    • Если путь начинается с подстроки "/hl", сервер показывает "подсвеченный" документ, указанный в поле запроса url, в котором выделены слова, релевантные запросу, содержащемуся в поле text.
    • Если предыдущие условия не выполняются, путь (без начального слеша) рассматривается как название поискового сервера, заданное в атрибуте id секции Collection конфигурационного файла сервера. В частном случае одной коллекции документов это имя может быть пустым.

      Если поисковый сервер с указанным именем найден, анализируется запрос. В противном случае показывается страница с сообщением об ошибке.

  • Если запрос содержит поле where со значением "1", запрос перенаправляется на сервер www.yandex.ru, в качестве текста запроса используется значение поля text.
  • Если запрос пустой, показывается поисковая форма с параметрами по умолчанию.
  • Если запрос содержит поле q, в котором передается идентификатор предварительно выполненного запроса, то будет загружена следующая страница результатов этого запроса, указанная в поле p, при условии, что
    • В настройке поиска указано, что запросы надо кешировать (см. секцию QueryCache).
    • Выполненный ранее запрос не удален из кеша по истечении времени хранения.
    • Текущий запрос не содержит поля nocache.

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

    Чтобы эта попытка была успешной, запрос должен содержать все необходимые поля, как при первичном выполнении. Если запрос выполнен успешно, будет показана страница, указанная в поле p.

  • Если не выполняется ничего из перечисленного выше, вызывается функция UserRequest, которая должна установить текст поискового запроса на языке запросов Яндекса.

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

    Реализация функции UserRequest по умолчанию использует в качестве поискового запроса значение поля text и может быть изменена в процессе настройки сервера.

  • Если поисковый запрос успешно получен, выполняется собственно поиск, после чего показывается страница с результатами выполнения запроса.

    Если запрос содержит поле xml со значением "yes", результаты поиска будут представлены в формате XML. Схема результирующего XML приведена в файлах request.xs и yandex.xs, включенных в комплект поставки.

    Внимание!
    В текущей версии Яндекс.Сервера (2009.05) поисковые результаты в форматах XML и HTML формируются по-разному: при обработке запроса в HTML используется НЕстрогое соответствия, в XML – строгое. XML можно настроить, используя параметр мягкости в тексте запроса: добавьте значение мягости=50 в текст запроса («//50») и получится тот же результат, что и в HTML. В следующей версии Яндекс.Сервера механизм формирования результатов XML и HTML будет идентичен.

    Если поле xml со значением "yes" отсутствует, страница с результатами поиска будет сформирована в соответствии с шаблоном, указанным в секции SearchPageTemplate конфигурации поискового сервера, или в соответствии с встроенным шаблоном, если эта секция отсутствует.

  • Если ни одно из предыдущих условий не выполнено, показывается страница с сообщением об ошибке.

Поля поисковой формы, используемые Яндекс.Сервером

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

Поле Описание
where Значение "1" перенаправляет поисковый запрос на www.yandex.ru.
url Сигнализирует, что должен быть показан "подсвеченный" документ.
text В отсутствие параметра url сигнализирует, что должен быть выполнен новый запрос, по умолчанию содержит текст запроса
xml Значение "yes" сигнализирует о том, что результаты должны быть представлены в XML-формате.
numdoc Число документов на одной странице выдачи, если не указано поле g, по умолчанию "10".
t Максимальное число фрагментов текста для документа при их использовании, по умолчанию "3".
ds URL документа для поиска похожих документов.
how

Способ сортировки найденных документов, может принимать значения:

rlv - сортировка по релевантности (степени соответствия запросу);

tm - сортировка по дате последней модификации;

usrf - сортировка с использованием заданной пользователем функции вычисления релевантности;

<имя группировочного атрибута> - сортировка по значению указанного атрибута.

asc Уточняет поле how, указывая сортировку в обратном порядке.
np Уточняет поле how, указывая сквозную сортировку без учета групп приоритетности.
g Задает группировку найденных документов, это поле подробно описано ниже. Полей g может быть несколько, по числу необходимых группировок.

Поле g имеет структуру mode.attr.ngrp.ndoc.cur, где

mode - тип группировки. "0" - пустая. "1" - плоская или глубокая, если атрибут иерархический. "2" - широкая, имеет смысл только для иерархического атрибута.

attr - имя группировочного атрибута, по которому будет осуществляться группировка, в случае пустой группировки - пустая строка.

ngrp - число групп на одной странице.

ndoc - максимальное число документов в группе, документы сверх этого числа выкидываются на этапе выполнения группировки.

cur - значение атрибута для того узла иерархии, группы документов которого надо показать. Группы, не имеющие этого узла среди "родителей", выкидываются на этапе выполнения группировки. Имеет смысл только в случае иерархического атрибута. Значение по умолчанию: "1" (показать всю иерархию).

Заметим, что по умолчанию при выполнении запроса не делается никаких группировок. Для того чтобы получить ту или иную группировку, необходимо задать поле g. Группировка и сортировка происходят на этапе выполнения запроса, поэтому нельзя использовать функции работы с группами при построении выдачи, если до выполнения поиска не были заданы соответствующие поля.

fa Задает фильтрацию найденных документов по атрибуту, это поле подробно описано ниже.

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

Использование поля fa для фильтрации результатов поиска по группировочным атрибутам предпочтительнее, чем использование поисковых атрибутов в поисковом запросе (если в индексе есть поисковые атрибуты с теми же названиями и числовыми значениями), так как работает быстрее.

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

Пример:

fa=price:40-50
fa=f:1-20;d:-30;t:40-
Следующие поля являются служебными и участвуют в формировании адресов страниц с результатами поиска и подсвеченными документами.
q Идентификатор запроса для следующей страницы.
p Номер страницы результатов поиска, начиная с нуля.
mime Формат подсвеченного документа.
charset Кодировка подсвеченного документа.
hldoclist Адрес страницы с результатами поиска, на которой находится ссылка на подсвеченный документ.

Использование функций формирования страниц (C++ и Perl)

Функции, вызываемые поисковым сервером

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

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

Функции и их описание

int UserInit(IInitContext *ictx, void **userHndl)

sub UserInit

Вызывается только один раз при старте поискового сервера, позволяет в случае необходимости инициализировать глобальные переменные и объекты. Для языка Perl вызывается без параметров.

Для C++ принимает два аргумента.

Первый является указателем на интерфейс контекста инициализации, декларированный в файле initcb.h. Функция IInitContext::GetCommandLine() позволяет получить аргумент директивы Options секции SearchPageTemplate конфигурационного файла.

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

int UserDone(void *userHndl)

Вызывается только один раз при завершении поисковой сессии.

int UserSearch(void *userHndl, IRequestContext* rc)

sub UserSearch

Вызывается поисковым сервером один раз в начале выполнения запроса, чтобы дать возможность подменить логику обработки или выполнить несколько поисков при выполнении запроса.

Если возвращает "0", выполнение запроса поисковым сервером прекращается, иначе сервер выполняет запрос, вызывая функции в той же последовательности, как и в следующем примере.

Интерфейс IRequestContext описан в pagecb.h.

int UserSearch(void* /*userHandler*/, IRequestContext* rc)
  {
      ISearchContext* ysc = rc->CreateContext();
      UserHttpHeaders(rc, ysc);
      UserRequest(ysc);
      rc->Search(ysc);
      UserReport(ysc);
      rc->DestroyContext(ysc);
      return 0;
  }

int UserHttpHeaders(ISearchContext* ysc)

sub UserHttpHeaders

Вызывается в самом начале формирования страницы с результатами поиска для установки дополнительных HTTP-заголовков.

void UserRequest(ISearchContext* ysc)

sub UserRequest

Вызывается до выполнения поискового запроса. Предназначена для преобразования полей поисковой формы в строку запроса на языке запросов Яндекса.

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

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

На C++ текст запроса следует установить с помощью функции void IReqResults::SetUserRequest(const char *req), на Perl запрос является возвращаемым значением.

int UserReport(ISearchContext* ysc)

sub UserReport

Вызывается после выполнения запроса для формирования страницы с результатами поиска. Вся структура и дизайн страницы результатов задается в этой функции.

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

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

void HitStartBody(ISearchContext* ysc)

Hit::StartBody()

Верхняя вывеска-табличка в подсвеченном документе.

void HitEndBody(ISearchContext* ysc, int DocChanged, int FoundInBody, int FoundInCData)

Hit::EndBody(DocChanged, FoundInBody, FoundInCData)

Нижняя вывеска-табличка в подсвеченном документе.

DocChanged - равен "0", если документ не был изменен с момента последнего индексирования, в противном случае равен "1".

FoundInBody - найдено слов в теле документа (можно подсветить).

FoundInCData - найдено слов в области, не разрешающей подсветку (заголовок документа, меню, многострочные области ввода).

void HitFirst(ISearchContext* ysc)

Hit::First()

Стрелочка-ссылка на первое найденное слово.

void HitLast(ISearchContext* ysc)

Hit::Last()

Стрелочка-ссылка на последнее найденное слово.

void HitLeft(ISearchContext* ysc, int word_num, int word_prev_num)

Hit::Left(word_num, word_prev_num)

Стрелочка-ссылка на предыдущее найденное слово.

word_num - номер найденного слова.

word_prev_num - номер предыдущего найденного слова.

void HitRight(ISearchContext* ysc, int word_num)

Hit::Right(word_num)

Стрелочка-ссылка на следующее найденное слово.

word_num - номер найденного слова.

Функции, вызываемые разработчиком страницы результатов

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

Функции и их описание
Свойства поисковой сессии, независимые от данного поиска

int IIndexProperty::AttrCount()

Yx::AttrCount()

Возвращает число атрибутов в базе группировочных атрибутов.

const char *IIndexProperty::Attr(int attrnum)

Yx::Attr(attrnum)

Возвращает имя каждого группировочного атрибута.

attrnum - номер атрибута по порядку, от нуля до значения, возвращаемого AttrCount().

const char *IIndexProperty::CategName(const char *attr, long cat)

Yx::CategName(attr, cat)

Возвращает строковый идентификатор данного значения группировочного атрибута.

attr - имя группировочного атрибута.

cat - числовое значение атрибута.

Функцию можно использовать, если в индексном каталоге есть файл attr.c2n, где "attr" - значение первого аргумента функции (подробности см. в разделе База группировочных атрибутов).

long IIndexProperty::CategParent(const char *attr, long cat)

Yx::CategParent(attr, cat)

Возвращает родительское значение данного значения иерархического группировочного атрибута.

attr - имя группировочного атрибута.

cat - числовое значение атрибута.

Функцию можно использовать, если в индексном каталоге есть файл attr.c2p, где "attr" - значение первого аргумента функции (подробности см. в разделе База группировочных атрибутов).

time_t IIndexProperty::IndexModTime()

Yx::IndexModTime()

Возвращает время создания индекса в секундах от 00:00:00 1 января 1970 до момента последней модификации файла indexkey.

const char *IIndexProperty::ImagesUrl()

Yx::ImagesUrl()

Возвращает веб-адрес встроенного каталога с картинками.

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

Фактически функция возвращает строку вида http://host:port/images/ , где "host" - значение директивы Host, а "port" - значение директивы Port секции Server конфигурационного файла поискового модуля.

const char *IIndexProperty::ConfigParam(const char *directive)

Yx::ConfigParam(directive)

Возвращает аргумент указанной директивы конфигурационного файла.

Директива должна находится в подсекции UserParams секции Collection конфигурационного файла.

Подсекция UserParams может содержать любое число директив с произвольными ключами, значения аргументов которых могут быть использованы при формировании страницы с результатами поиска, например:

const char* MyTest = ysc->IndexProperty()->ConfigParam("MyTest");
if (MyTest && strcmp(MyTest, "yes") == 0)
    YxPrint(ysc, "Test!");

directive - ключ директивы, расположенной в подсекции UserParams секции Collection конфигурационного файла.

const char *IReqEnv::SearchUrl()

Yx::SearchUrl()

Возвращает префикс веб-страницы, принимающей поисковые запросы.

Возвращаемое значение нужно использовать в качестве значения атрибута action html-тага form.

Фактически функция возвращает строку вида http://host:port/id , где "host" и "port" - значения директив Host и Port секции Server конфигурационного файла поискового модуля, а id - идентификатор коллекции документов, то есть значение одноименного атрибута секции Collection конфигурационного файла поискового модуля.

Данные о поисковом запросе

До и после выполнения поискового запроса можно получить или изменить данные о нем.

const char *IReqEnv::HeaderIn(const char* key)

Yx::HeaderIn(key)

Возвращает значение HTTP-заголовка key, переданного клиентом в запросе к поисковому веб-серверу. Если указанного заголовка нет, возвращает "0" (C++) или неопределенное ("undef") значение (Perl).

key - название HTTP-заголовка в запросе

const char *IReqEnv::Environment(const char* key)

Yx::GetEnv(key)

Возвращает значение одной из переменных окружения, указанных ниже.

Если указанной переменной нет, возвращает "0" (C++) или неопределенное ("undef") значение (Perl). В переменной key может передаваться одна из следующих строк:

"QUERY_STRING" - часть URL поисковой страницы после знака вопроса, содержащая значения полей поисковой формы.

"SERVER_NAME" - доменное имя поискового сервера.

"SERVER_PORT" - порт, на котором работает поисковый сервер.

"SCRIPT_NAME" - часть относительного URL поисковой страницы до знака вопроса, abs_path в терминах RFC 2616.

"REMOTE_ADDR" - если в поисковом запросе есть HTTP-заголовок "X-Real-IP", будет возвращено значение этого заголовка, в противном случае - IP-адрес клиента, задавшего поисковый запрос.

int IReqEnv::FormFieldTest(const char* key, const char* value)

Yx::FormFieldTest(key, value)

Возвращает "1", если есть поле формы key со значением value, в противном случае - "0".

key - имя поля формы.

value - значение поля формы.

int IReqEnv::FormFieldCount(const char* key)

Yx::FormFieldCount(key)

Возвращает число одноименных полей.

key - имя поля формы.

const char *IReqEnv::FormField(const char* key, int num, bool encode = false)

Yx::FormField(key, num = 0)

Возвращает значение поля формы key. Если запрашиваемого поля нет, возвращает "0" (C++) или неопределенное ("undef") значение (Perl).

key - имя поля формы.

num - номер значения, начиная с 0.

encode - флаг, указывающий, нужно ли перекодировать запрещенные в HTML символы.

const char *IReqEnv::QueryString()

Yx::QueryString()

Возвращает все поля поисковой формы в формате адреса веб-страницы.

Возвращаемое значение может отличаться от значения Environment("QUERY_STRING"), так как учитывает результаты вызовов FormFieldInsert и FormFieldRemove из UserRequest.

void IReqEnv::FormFieldInsert(const char* key, const char* value)

Yx::FormFieldInsert(key, value)

Функция вставляет в список переданных полей поисковой формы новое значение. Эффект такой же, как если бы поле было передано из формы на веб-странице.

key - имя поля формы.

value - значение поля формы, которое нужно вставить.

void IReqEnv::FormFieldRemove(const char *key, int num)

Yx::FormFieldRemove(key, num)

Функция удаляет данное поле из списка переданных полей.

key - имя поля формы.

num - номер значения, которое надо удалить, начиная с 0.

Статистика, относящаяся к запросу в целом

const char *IReqResults::ReqId()

Yx::ReqId()

Возвращает идентификатор запроса, назначенный поисковым сервером.

const char *IReqResults::Request()

Yx::Request()

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

int IReqResults::ErrorCode()

Yx::ErrorCode()

При неудачном поиске возвращает код ошибки.

const char *IReqResults::ErrorText(const char* lang = "ru")

Yx::ErrorText(lang)

При неудачном поиске возвращает описание ошибки.

lang - строка-идентификатор языка.

const char *IReqResults::WordStat()

Yx::WordStat()

Возвращает строку со статистикой найденных слов в формате слово:количество.

int ICluster::TotalDocCount(int prior)

Yx::TotalDocCount(prior = 0)

Возвращает число найденных документов с данным приоритетом релевантности.

prior - приоритет релевантности.

Значение "2" соответствуют совпадению фразы, "1" - строгому соответствию запросу, "0" - нестрогому соответствию запросу.

В числе, возвращаемом при меньшем значении параметра, суммируется количество документов с худшим приоритетом, так что при значении "0" функция возвращает полное число найденных документов.

Свойства группировки

long ICluster::CurCateg(const char *attr, int gMode)

Yx::CurCateg(attr, gMode)

Возвращает текущую группу (числовое значение атрибута), заданную при определении группировки.

attr - имя группировочного атрибута.

gMode - тип группировки, "1" - плоская или глубокая, если атрибут иерархический, "2" - широкая, имеет смысл только для иерархического атрибута.

const char *IReqEnv::SearchPageUrl(int npage, const char *attr)

Yx::SearchPageUrl(npage, attr)

Возвращает веб-адрес одной из страниц с найденными документами данной группировки. Этот адрес всегда начинается со строки, возвращаемой функцией SearchUrl.

npage - номер страницы по порядку, начиная с нуля.

attr - имя группировочного атрибута.

int ICluster::Count(int prior, const char *attr, int gMode)

Yx::Count(prior, attr, gMode)

Возвращает число найденных групп в данной группировке, полученное в процессе выполнения запроса.

prior - приоритет релевантности, как описано для функции TotalDocCount.

Свойства группы в данной группировке

long ICluster::GroupCateg(int nGroup, const char *attr, int gMode)

Yx::GroupCateg(nGroup, attr, gMode)

Возвращает числовое значение группировочного атрибута, соответствующее данной группе.

nGroup - номер группы по порядку, начиная с нуля на первой странице, и с произведения (номер страницы)*(количество групп на странице) на последующих.

attr - имя группировочного атрибута.

gMode - тип группировки, "1" - плоская или глубокая, если атрибут иерархический, "2" - широкая, имеет смысл только для иерархического атрибута.

int ICluster::GroupDocCount(int prior, int nGroup, const char *attr, int gMode)

Yx::GroupDocCount(prior, nGroup, attr, gMode)

Возвращает число документов, попавших в данную группу в процессе группировки.

prior - приоритет релевантности, как описано для функции TotalDocCount. Полному числу документов в группе соответствует значение "0".

int ICluster::GroupRelevance(int nGroup, const char *attr, int gMode)

Yx::GroupRelevance(nGroup, attr, gMode)

Возвращает релевантность группы в виде положительного целого числа.

int ICluster::GroupPriority(int nGroup, const char *attr, int gMode)

Yx::GroupPriority(nGroup, attr, gMode)

Возвращает приоритет релевантности группы.

Значения "5", "6", "7" соответствуют совпадению фразы, "2", "3", "4" - строгому соответствию запросу, "0", "1" - нестрогому соответствию запросу.

Свойства документа в данной группе

long ICluster::DocId(int nGroup, int nDoc, const char *attr, int gMode)

Yx::DocId(nGroup, nDoc, attr, gMode)

Возвращает числовой идентификатор документа, назначенный при индексировании.

nGroup - номер группы по порядку, начиная с нуля на первой странице, и с произведения (номер страницы)*(количество групп на странице) на последующих.

nDoc - номер документа в группе по порядку, от нуля до значения "GroupDocCount(...)-1" включительно.

attr - имя группировочного атрибута.

gMode - тип группировки, "1" - плоская или глубокая, если атрибут иерархический, "2" - широкая, имеет смысл только для иерархического атрибута.

int ICluster::DocPriority(int nGroup, int nDoc, const char *attr, int gMode)

Yx::DocPriority(nGroup, nDoc, attr, gMode)

Возвращает приоритет релевантности документа, как описано для функции GroupPriority.

long ICluster::DocRelevance(int nGroup, int nDoc, const char *attr, int gMode)

Yx::DocRelevance(nGroup, nDoc, attr, gMode)

Возвращает релевантность документа в виде положительного целого числа.

const char *IReqEnv::HighlightedDocUrl(int nGroup, int nDoc, const char *attr, int gMode)

Yx::HighlightedDocUrl(nGroup, nDoc, attr, gMode)

Возвращает веб-адрес страницы с подсвеченным документом. Этот адрес всегда начинается со строки, возвращаемой функцией SearchUrl.

int ICluster::DocPropertyCount(int nGroup, int nDoc, const char *attr, int gMode, const char* property)

Yx::DocPropertyCount(nGroup, nDoc, attr, gMode, property)

Возвращает число различных значений свойства документа, указанного в аргументе property.

property - название свойства в виде строки.

В качестве свойства можно передавать следующие значения.

  • Название группировочного атрибута, которое возвращается функцией Attr(attrnum).

    В этом случае функция вернет "0", если у данного документа указанный группировочный атрибут отсутствует, "1", если атрибут имеется, или значение, большее 1, если имеется несколько значений иерархического атрибута.

  • Один из аргументов директивы DocProperty конфигурации индексатора.

    В этом случае функция вернет "0", если у данного документа указанный поисковый атрибут отсутствует, и "1", если атрибут имеется.

  • Одно из следующих значений.

    "_Url" - URL документа.

    "_ModTime" - время в секундах, прошедшее с 00:00:00 1 января 1970 года до момента последнего изменения файла с документом.

    "_ModTimeStr" - то же, что и "_ModTime", но в виде строки формата 18 Aug 2000, 08:52.

    "_Size" - размер файла с документом в байтах.

    "_Charset" - кодировка документа.

    "_MimeType" - медиа-тип документа.

    "_Title" - заголовок документа.

    "_HeadLine" - краткое содержание документа или первые 200 символов текста.

    "_Passage" - отрывок текста документа, содержащий искомые слова.

    Функция вернет "1", кроме свойства "_Passage", значений которого может быть несколько, но не больше, чем указано в параметре поисковой формы t.

const char *ICluster::DocProperty(int nGroup, int nDoc, const char *attr, int gMode, const char* property, unsigned index)

Yx::DocProperty(nGroup, nDoc, attr, gMode, property, index)

Возвращает значение указанного свойства документа.

property - название свойства в виде строки, возможные значения перечислены в описании функции DocPropertyCount.

index - номер значения свойства от нуля до значения, возвращаемого функцией DocPropertyCount.

Для свойств "_Title", "_HeadLine" и "_Passage" функция возвращает строку, размеченную специальным символом BEL (символ с кодом "7") следующим образом.

  • "BEL{" и "BEL}" окружают слова с приоритетом "совпадение фразы".
  • "BEL[" и "BEL]" окружают слова с приоритетом "строгое соответствие".
  • "BEL(" и "BEL)" окружают слова с приоритетом "нестрогое соответствие".

Размеченные таким образом строки могут быть преобразованы с помощью функции ConvertArchiveText.

const char* IReqEnv::ConvertArchiveText(const char* rawtext, unsigned maxLen, int mode, const char *Open1, const char *Open2, const char *Open3, const char *Close1, const char *Close2, const char *Close3)

Yx::ConvertArchiveText(rawtext, maxLen, mode, Open1, Open2, Open3, Close1, Close2, Close3)

Функция преобразует заголовок, аннотацию и фрагменты текста документа, возвращаемые функцией DocProperty.

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

rawtext - размеченный текст, выданный функцией DocProperty, который надо обработать.

maxLen - длина, до которой надо укоротить rawtext, если этот параметр равен "0", то текст не укорачивается.

mode - вид обработки. "0" - запрещенные в HTML символы заменяются на соответствующие последовательности, а специальная разметка слов - на указанные теги. "1" - запрещенные в HTML символы заменяются на соответсвующие последовательности, а специальная разметка слов выбрасывается. "2" - запрещенные в HTML символы не заменяются, специальная разметка слов выбрасывается.

Open1, Close1 - Открывающий и закрывающий теги для слов, найденных с нестрогим соответствием.

Open2, Close2 - Открывающий и закрывающий теги для слов, найденных со строгим соответствием.

Open3, Close3 - Открывающий и закрывающий теги для слов, найденных с совпадением фразы.

Функции формирования HTTP-заголовков на Perl

Yx::HeaderOut(header, value)

Функция печатает HTTP-заголовок header со значением "value".

header - HTTP-заголовок.

value - значение HTTP-заголовка.

Yx::ContentType(value)

value - значение заголовка.

Функция печатает HTTP-заголовок Content-Type со значением "value".

Yx::SetLastModified()

Функция печатает HTTP-заголовок Last-Modified со временем изменения индексных файлов в качестве значения заголовка.

Примеры использования C++

В данном разделе приведены простейшие примеры использования описанных выше функций на языке C++.

Пример

int UserHttpHeaders(ISearchContext* ysc)
int UserHttpHeaders(ISearchContext* ysc)
{
    YxPrint(ysc, "Content-Type: text/html\n");
    YxPrint(ysc, "Cache-Control: max-age=3600\n");
    YxPrint(ysc, "Last-Modified: ");
    YxPrintHttpTime(ysc, ysc->IndexProperty()->IndexModTime());
    YxPrint(ysc, "\n");
    return 0;
}

Пример

void UserRequest(ISearchContext* ysc)

Текст запроса на языке запросов Яндекса следует установить с помощью функции SetUserRequest.

void UserRequest(ISearchContext* ysc)
{
    const char* p = ysc->ReqEnv()->FormField("text", 0);
    if (!p || !strlen(p)) {
        ysc->ReqResults()->SetUserRequest("");
        return;
    }
    char Query[1024];
    strncpy(Query, p, 200);

    // поиск документов, измененных за последние N дней,
    // где N определяется cgi-параметром within
    const char* within = ysc->ReqEnv()->FormField("within", 0);
    if (within && within[0] != '0') {
        char Temp[512];
        int days = atol(within);
        time_t beg_time = time(0) - days * 3600 * 24;
        strftime(Temp, 1024, "&&#date>=\"%Y%m%d\"", localtime(&beg_time));
        strcat(Query, Temp);
    }
    ysc->ReqResults()->SetUserRequest(Query);
}

Пример

int UserReport(ISearchContext* ysc)
int UserReport(ISearchContext* ysc)
{
    YxPrint(ysc, "<html><head><title>Список найденных документов</title></head>");
    YxPrint(ysc, "<body><p>");
    const char *stat = ysc->ReqResults()->WordStat();
    if(stat && *stat) {
        YxPrint(ysc, "Результат поиска: ");
        YxPrint(ysc, stat);
        YxPrint(ysc, "<br>\n");
        YxPrint(ysc, "Найдено документов: <b>");
        YxPrint(ysc, ysc->Cluster()->TotalDocCount(0));
        YxPrint(ysc, "</b>\n");
    }
    YxPrint(ysc, "</body></html>");
    return 0;
}

Примеры использования Perl

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

Пример

sub UserInit
sub UserInit {
  # Каталог, содержащий картинки
  $::PICTURE_DIR  = Yx::ImagesUrl();
  # количество документов в списке найденного
  $::DEF_NUM_DOC  = 10;
  # количество отображаемых для каждого документа контекстов
  $::DEF_NUM_PASSAGES = 3;
  # Включить в форму поиск похожих документов
  $::USE_SIMILAR_DOCS_SEARCH = 1;
}

Пример

sub UserHttpHeaders
sub UserHttpHeaders {
  Yx::ContentType ("text/html");
  Yx::HeaderOut("Cache-Control", "max-age=3600");
  Yx::SetLastModified();
}

Пример

sub UserRequest
sub UserRequest {
    my $text = Yx::FormField("text");
    return "" if $text eq "";

    my $req = $text;

    # поиск документов, измененных за последние N дней,
    # где N определяется cgi-параметром within
    my $within = Yx::FormField("within");
    if ($within != 0) {
        my $beg_time = time() - ($within * 3600 * 24);
        my ($sec,$min,$hour,$mday,$mon,$year) = localtime($beg_time);
        $req .= "&&#date>=".sprintf("\"%04d%02d%02d\"", $year+1900, $mon+1, $mday);
    }
    return $req;
}

Пример

sub UserReport

Перловый модуль, используемый для настройки поисковой выдачи, представляет собой HTML-файл с участками кода на Perl 5, заключенными между разделителями <% и %>:

<%
sub UserReport {
%>
<html><head><title>Список найденных документов</title></head>
<body><p>
<%
    my $stat = Yx::WordStat();
    if ($stat ne "") {
        print "Результат поиска: $stat<br>\n";
        print "Найдено документов: <b>".Yx::TotalDocCount()."</b>\n";
    }
%>
</body></html>
<%
return 0;
}
%>