| Яndex.Server 3.4: Руководство пользователя | ||
|---|---|---|
| Пред. | Глава 7. Настройка и использование поискового сервера | След. |
Яndex.Server ожидает поступления 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.
Если не выполняется ничего из перечисленного выше, вызывается функция UserRequest, которая должна установить текст поискового запроса на языке запросов Яндекса. Действия, выполняемые в этой функции, обычно сводятся к преобразованию значений некоторых полей поисковой формы в текст поискового запроса. Реализация функции UserRequest по умолчанию использует в качестве поискового запроса значение поля text и может быть изменена в процессе настройки сервера.
Если поисковый запрос успешно получен, выполняется собственно поиск, после чего показывается страница с результатами выполнения запроса. Если запрос содержит поле xml со значением yes, результаты поиска будут представлены в формате XML. Схема результирующего XML приведена в файлах request.xs и yandex.xs, включенных в комплект поставки. Если поле xml со значением yes отсутствует, страница с результатами поиска будет сформирована в соответствии с шаблоном, указанным в секции SearchPageTemplate конфигурации поискового сервера, или в соответствии с встроенным шаблоном, если эта секция отсутствует.
Если ни одно из предыдущих условий не выполненно, показывается страница с сообщением об ошибке.
При выполнении поиска множество найденных документов может быть упорядочено:
по значению релевантности, определяемой поисковой системой
по времени последней модификации документа
по значениям группировочного атрибута
По умолчанию, сортировка производится независимо для трех разных групп документов, отличающихся степенью соответствия запросу. Этим трем группам соответствуют следующие приоритеты релевантности:
совпадение фразы
строгое соответствие
нестрогое соответствие
Под совпадением фразы понимается максимальное соответствие запросу. Обычно это соответствует ситуации, когда состав и порядок слов в запросе полностью совпадает с составом и порядком слов во фрагменте найденного документа. Однако, если в запросе используются операторы ограничения контекста, то приоритет совпадение фразы может описывать иную ситуацию. Например, если был задан запрос
Анатолий /+2 Бышовец(с целью узнать отчество персоны), то с совпадением фразы найдутся документы, содержащие фрагмент "Анатолий Федорович Бышовец", а документы, включающие фрагмент "Анатолий Бышовец" найдутся всего лишь со строгим соответствием, и поэтому будут иметь более низкий ранг.
Под строгим соответствием понимается "формальное соответствие запросу". В наиболее распространенной ситуации это означает, что пользователь язык запросов Яндекса не использует, и все слова, которые он перечислил в запросе, содержатся в одном предложении искомого документа.
Нестрогое соответствие запросу может возникнуть, когда в запросе используется оператор нестрогого поиска. В наиболее распространенном случае "документ найден с нестрогим соответствием" означает, что пользователь язык запросов Яндекса не использует, и в этом документе нет ни одного предложения, в котором бы встретились все слова из запроса; есть только предложения, в которых есть самые важные с точки зрения Яндекса слова из запроса (более строго, в этом случае работает алгоритм поиска по кворуму со взвешиванием терминов).
Следует отметить, что по умолчанию приоритеты релевантности учитываются при альтернативных сортировках. Например, в случае, если документы отсортированы по дате модификации, порядок вышеупомянутых трех групп документов не меняется. Т.е. сначала перечисляются все документы с приоритетом "совпадение фразы", отсортированные внутри этой группы по дате, затем - все документы с приоритетом "строгое соответствие", отсортированные внутри этой группы по дате и т.д. Чтобы отменить учет приоритетов при альтернативных сортировках нужно задать в поисковой форме поле np.
Следующие поля задают сортировку, группировку или структурные параметры страницы с результатами поиска и могут самостоятельно устанавливаться пользователями или разработчиками сайта.
where -
значение 1 перенаправляет поисковый запрос на
www.yandex.ru |
| url - сигнализирует, что должен быть показан "подсвеченный" документ |
| text - в отсутствие параметра url сигнализирует, что должен быть выполнен новый запрос, по умолчанию содержит текст запроса |
xml -
значение yes сигнализирует о том,
что результаты должны быть представлены в XML-формате |
numdoc -
число документов на одной странице выдачи, если не указано поле g,
по умолчанию 10 |
t -
максимальное число фрагментов текста для документа, при их использовании,
по умолчанию 3 |
| ds - URL документа для поиска похожих документов |
how -
способ сортировки найденных документов, может принимать значения
rlv - сортировка по релевантности (степени соответствия запросу),
tm - сортировка по дате последней модификации или имя группировочного атрибута |
| asc - уточняет поле how, указывая сортировку в обратном порядке |
| np - уточняет поле how, указывая сквозную сортировку без учета групп приоритетности |
| g - задает группировку найденных документов, это поле подробно описано ниже. |
Полей g может быть несколько, по числу необходимых группировок. Поле g имеет структуру mode.attr.ngrp.ndoc.cur, где
| mode - тип группировки, 0 - пустая, 1 - плоская или глубокая, если атрибут иерархический, 2 - широкая, имеет смысл только для иерархического атрибута |
| attr - имя группировочного атрибута, по которому будет осуществляться группировка, в случае пустой группировки - пустая строка. |
| ngrp - число групп на одной странице |
| ndoc - максимальное число документов в группе, документы сверх этого числа выкидываются на этапе выполнения группировки |
| cur - значение атрибута для текущей группы, имеет смысл только в случае иерархического атрибута; документы, не имеющие значений атрибута в иерархии указанного значения, выкидываются на этапе выполнения группировки |
Следующие поля являются служебными и участвуют в формировании адресов страниц с результатами поиска и подсвеченными документами.
| q - идентификатор запроса для следующей страницы |
| p - номер страницы результатов поиска, начиная с нуля |
| mime - формат подсвеченного документа |
| charset - кодировка подсвеченного документа |
| hldoclist - адрес страницы с результатами поиска, на которой находится ссылка на подсвеченный документ. |
В процессе выполнения поискового запроса поисковый сервер вызывает следующие функции, которые могут быть написаны разработчиком страницы с результатами поиска. Если какая-либо из функций не предоставлена разработчиком поисковой страницы, будет использована реализация по умолчанию, такая же, как во встроенном дизайне.
Используется только для языка Perl. Вызывается только один раз при старте поискового сервера для инициализации перловых переменных.
Вызывается в самом начале формирования страницы с результатами поиска для установки дополнительных HTTP-заголовков.
Вызывается до выполнения поискового запроса. Предназначена для преобразования полей поисковой формы в строку запроса на языке запросов Яндекса. Использование этой функции полезно, если пользователи системы не знакомы с языком запросов и используют переключатели формы для уточнения области поиска. В этой функции также можно установить поля запроса, влияющие на сортировку и группировку с помощью вызова FormFieldInsert. На C++ текст запроса следует установить с помощью функции void IReqResults::SetUserRequest(const char *req), на Perl запрос является возвращаемым значением.
Вызывается после выполнения запроса для формирования страницы с результатами поиска. Вся структура и дизайн страницы результатов задается в этой функции.
В процессе формирования документа с подсвеченными словами поисковый сервер вызывает следующие функции, которые могут быть написаны разработчиком страницы с результатами поиска. Если какая-либо из функций не предоставлена разработчиком поисковой страницы, будет использована реализация по умолчанию, такая же, как во встроенном дизайне.
Верхняя вывеска-табличка в подсвеченном документе.
Нижняя вывеска-табличка в подсвеченном документе.
| DocChanged - равен 0, если документ не был изменен с момента последнего индексирования, в противном случае равен 1. |
| FoundInBody - найдено слов в теле документа (можно подсветить) |
| FoundInCData - найдено слов в области, не разрешающей подсветку (заголовок документа, меню, многострочные области ввода) |
Стрелочка-ссылка на первое найденное слово.
Стрелочка-ссылка на последнее найденное слово.
Стрелочка-ссылка на предыдущее найденное слово.
| word_num - номер найденного слова |
| word_prev_num - номер предыдущего найденного слова |
Стрелочка-ссылка на следующее найденное слово.
| word_num - номер найденного слова |
В функциях, вызываемых поисковым сервером, разработчик страницы с результатами поиска или с подсвеченным документом может для получения дополнительной информации использовать следующие функции, имплементированные в поисковом сервере.
Свойства поисковой сессии, независимые от данного поиска
Возвращает число атрибутов в базе группировочных атрибутов.
Возвращает имя каждого группировочного атрибута.
| attrnum - номер атрибута по-порядку, от нуля до значения, возвращаемого AttrCount(). |
Возвращает строковый идентификатор данного значения группировочного атрибута.
| attr - имя группировочного атрибута |
| cat - числовое значение атрибута |
Возвращает родительское значение данного значения иерархического группировочного атрибута.
| attr - имя группировочного атрибута |
| cat - числовое значение атрибута |
Возвращает время создания индекса в секундах от 00:00:00 1 января 1970 до момента последней модификации файла indexkey.
Возвращает веб-адрес встроенной директории с картинками. Возвращаемое значение можно использовать, если в дизайне страниц результатов и подсветки используются изображения, выдаваемые Яndex.Server. Фактически функция возвращает строку вида http://host:port/images/, где host - значение директивы Host, а port - значение директивы Port секции Server конфигурационного файла Яndex.Server.
Возвращает префикс веб-страницы, принимающей поисковые запросы. Возвращаемое значение нужно использовать в качестве значения атрибута action html-тага form. Фактически функция возвращает строку вида http://host:port/id, где host и port - значения директив Host и Port секции Server конфигурационного файла Яndex.Server, а id - идентификатор коллекции документов, то есть значение одноименного атрибута секции Collection конфигурационного файла Яndex.Server.
Как до, так и после выполнения поискового запроса, можно узнать или изменить
Данные о поисковом запросе
Возвращает значение HTTP-заголовка key, переданного клиентом в запросе к поисковому веб-серверу. Если указанного заголовка нет, возвращает 0 (C++) или неопределенное (undef) значение (Perl).
| key - название HTTP-заголовка в запросе |
Возвращает значение одной из переменных окружения, указанных ниже. Если указанной переменной нет, возвращает 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-адрес клиента, задавшего поисковый запрос. |
Возвращает 1, если есть поле формы key со значением value, в противном случае - 0.
| key - имя поля формы |
| value - значение поля формы |
Возвращает число одноименных полей.
| key - имя поля формы |
Возвращает значение поля формы key. Если запрашиваемого поля нет, возвращает 0 (C++) или неопределенное (undef) значение (Perl).
| key - имя поля формы |
| num - номер значения, начиная с 0 |
| encode - флаг, указывающий, нужно ли перекодировать запрещенные в HTML символы |
Возвращает все поля поисковой формы в формате адреса веб-страницы. Возвращаемое значение может отличаться от значения Environment("QUERY_STRING"), так как учитывает результаты вызовов FormFieldInsert и FormFieldRemove из UserRequest.
Функция вставляет в список переданных полей поисковой формы новое значение. Эффект такой же, как если бы поле было передано из формы на веб-странице.
| key - имя поля формы |
| value - значение поля формы, которое нужно вставить |
Функция удаляет данное поле из списка переданных полей.
| key - имя поля формы |
| num - номер значения, которое надо удалить, начиная с 0 |
Статистика, относящаяся к запросу в целом
Возвращает идентификатор запроса, назначенный поисковым сервером.
Возвращает текст выполненного запроса, который может отличаться от введенного пользователем вследствие модификаций, выполненных в функции UserRequest.
Возвращает статус выполненного запроса. При успешном поиске - 0.
При неудачном поиске возвращает код ошибки.
При неудачном поиске возвращает описание ошибки.
| lang - строка-идентификатор языка |
Возвращает строку со статистикой найденных слов в формате слово:количество.
Возвращает число найденных документов с данным приоритетом релевантности.
| prior - приоритет релевантности. Значение 2 соответствуют совпадению фразы, 1 - строгому соответствию запросу, 0 - нестрогому соответствию запросу. В числе, возвращаемом при меньшем значении параметра, суммируется количество документов с худшим приоритетом, так что при значении 0 функция возвращает полное число найденных документов. |
Возвращает кодировку, в которой печатается страница с результатами поиска. По умолчанию, страница печатается в кодировке запроса, которая может быть задана в директиве QueryCharset. Кодировка выходной страницы может быть переопределена с помощью параметра charset поисковой формы.
Свойства группировки
Возвращает текущую группу (числовое значение атрибута), заданную при определении группировки.
| attr - имя группировочного атрибута |
| gMode - тип группировки, 1 - плоская или глубокая, если атрибут иерархический, 2 - широкая, имеет смысл только для иерархического атрибута |
Возвращает максимальное число групп на странице, заданное при определении группировки.
Возвращает максимальное число документов в группе, заданное при определении группировки.
Возвращает веб-адрес одной из страниц с найденными документами данной группировки. Этот адрес всегда начинается со строки, возвращаемой функцией SearchUrl.
| npage - номер страницы по-порядку, начиная с нуля |
| attr - имя группировочного атрибута |
Возвращает число найденных групп в данной группировке, полученное в процессе выполнения запроса.
| prior - приоритет релевантности, как описано для функции TotalDocCount. |
Свойства группы в данной группировке
Возвращает числовое значение группировочного атрибута, соответствующее данной группе.
| nGroup - номер группы по-порядку, начиная с нуля на первой странице, и с произведения (номер страницы)*(результат вызова GroupsOnPageCount) на последующих. |
| attr - имя группировочного атрибута |
| gMode - тип группировки, 1 - плоская или глубокая, если атрибут иерархический, 2 - широкая, имеет смысл только для иерархического атрибута |
Возвращает число документов, попавших в данную группу в процесе группировки. Так как запоминаются данные не более чем N первых документов, где N - число, возвращаемое функцией DocsInGroupCount(...), то для определения числа документов, которое можно показать для данной группы, надо взять минимум из этих двух чисел.
| prior - приоритет релевантности, как описано для функции TotalDocCount. Полному числу документов в группе соответствует значение 0. |
Возвращает релевантность группы в виде положительного целого числа.
Возвращает приоритет релевантности группы. Значения 5, 6, 7 соответствуют совпадению фразы, 2, 3, 4 - строгому соответствию запросу, 0, 1 - нестрогому соответствию запросу.
Свойства документа в данной группе
Возвращает числовой идентификатор документа, назначенный при индексировании.
| nGroup - номер группы по-порядку, начиная с нуля на первой странице, и с произведения (номер страницы)*(результат вызова GroupsOnPageCount) на последующих. |
| nDoc - номер документа в группе по-порядку, от нуля до значения GroupDocCount(...)-1 включительно. |
| attr - имя группировочного атрибута |
| gMode - тип группировки, 1 - плоская или глубокая, если атрибут иерархический, 2 - широкая, имеет смысл только для иерархического атрибута |
Возвращает приоритет релевантности документа, как описано для функции GroupPriority.
Возвращает релевантность документа в виде положительного целого числа.
Возвращает релевантность документа, приведенную к диапазону от 0 до 1.
Возвращает веб-адрес страницы с подсвеченным документом. Этот адрес всегда начинается со строки, возвращаемой функцией SearchUrl.
Возвращает число различных значений свойства документа, указанного в аргументе 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" - отрывок текста документа, содержащий искомые слова. |
Возвращает значение указанного свойства документа.
| property - название свойства в виде строки, возможные значения перечислены в описании функции DocPropertyCount. |
| index - номер значения свойства от нуля до значения, возвращаемого функцией DocPropertyCount. |
"BEL{" и "BEL}" окружают слова с приоритетом "совпадение фразы"
"BEL[" и "BEL]" окружают слова с приоритетом "строгое соответствие";
"BEL(" и "BEL)" окружают слова с приоритетом "нестрогое соответствие".
Функция преобразует заголовок, аннотацию и фрагменты текста документа, возвращаемые функцией DocProperty. Возвращает текст, в котором специальные символы заменены на указанные теги и который обрезан до нужной длины, по возможности, по словам.
| rawtext - размеченный текст, выданный функцией DocProperty,который надо обработать. |
| maxLen - длина, до которой надо укоротить rawtext, если этот параметр равен 0, то текст не укорачивается. |
| mode - вид обработки. 0 - запрещенные в HTML cимволы заменяются на соответсвующие последовательности, а специальная разметка слов - на указанные теги. 1 - запрещенные в HTML cимволы заменяются на соответсвующие последовательности, а специальная разметка слов выбрасывается. 2 - запрещенные в HTML cимволы не заменяются, специальная разметка слов выбрасывается. |
| Open1, Close1 - Открывающий и закрывающий теги для слов, найденных с нестрогим соответствием. |
| Open2, Close2 - Открывающий и закрывающий теги для слов, найденных со строгим соответствием. |
| Open3, Close3 - Открывающий и закрывающий теги для слов, найденных с совпадением фразы. |
Функции формирования HTTP-заголовков на Perl
Функция печатает HTTP-заголовок header со значением value.
| header - HTTP-заголовок |
| value - значение HTTP-заголовка |
| value - значение заголовка |
Функция печатает HTTP-заголовок Last-Modified со временем изменения индексных файлов в качестве значения заголовка.
В данном разделе приведены простейшие примеры использования описанных выше функций на языке C++. Реальные работающие примеры можно найти в файлах output.cpp и outpages.asp, включенных в комплект поставки программы.
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;
}Текст запроса на языке запросов Яндекса следует установить с помощью функции 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)
{
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. Реальные работающие примеры можно найти в файле report.phtml, включенном в комплект поставки программы.
sub UserInit {
Yx::SetSearchParam("ReportCoding", "KOI8-R");
# Каталог, содержащий картинки
$::PICTURE_DIR = Yx::ImagesUrl();
# количество документов в списке найденного
$::DEF_NUM_DOC = 10;
# количество отображаемых для каждого документа контекстов
$::DEF_NUM_PASSAGES = 3;
# Включить в форму поиск похожих документов
$::USE_SIMILAR_DOCS_SEARCH = 1;
} sub UserHttpHeaders {
Yx::ContentType ("text/html; charset=".Yx::Charset());
Yx::HeaderOut("Cache-Control", "max-age=3600");
Yx::SetLastModified();
} 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;
}Перловый модуль, используемый для настройки поисковой выдачи, представляет собой 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;
}
%>| Пред. | Начало | След. |
| Метапоиск и его настройка | Уровень выше | Язык запросов Яndex.Server 3.4 |