Компания

7. Настройка и использование поискового сервера


7.1 Директивы конфигурационного файла

Конфигурация поискового сервера состоит из директивы QueryCharset и секций QueryCache и SearchPageTemplate. Ни одна из директив или секций не является обязательной.

QueryCharset

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

Возможные значения приведены в следующей таблице:

Кодировка Обозначение
WinCyrillic windows-1251, cp1251
MacCyrillic MacCyrillic, MacRussian
DOSCyrillic IBM855 или cp855
DOSCyrillicRussian IBM866, cp866
ISOLatinCyrillic ISO-8859-5, iso-ir-144
WinLatin1 windows-1252, cp1252
WinLatin2 windows-1250, cp1250
KOI8R KOI8-R, csKOI8R
ISO8859_2 iso-2, iso_8859-2
UTF8 utf8, utf-8

Значение по умолчанию: windows-1251.

SearchOver

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

Значение по умолчанию: серверу.

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

Директивы секции SearchPageTemplate

Method

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

perl

Шаблон страницы написан на языке Perl. Для использования этого аргумента на компьютере должен быть установлен Perl 5.8, который используется для интерпретации шаблона. Пример такого шаблона приведен в файле report.phtml, включенного в поставку.

xsl

Шаблон страницы написан на XSLT. Шаблон интерпретируется встроенным в поисковый сервер процессором, основанным на библиотеке XALAN. Схема XML, поступающего на вход XSLT-шаблона, приведена в файлах request.xs и yandex.xs, включенных в комплект поставки. Пример XSLT-шаблона содержится в файле report.xsl, включенного в поставку.

binary

Шаблон страницы представляет собой предварительно скомпилированную бинарную динамическую библиотеку, обычно написанную на C++. Пример исходных кодов библиотеки содержится в директории sources_sample/report из комплекта поставки.

Module

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

Options

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

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

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

В секцию входят следующие директивы:

Директивы секции QueryCache

Policy

Определяет, будет ли кеширование полным или частичным. Если аргументом директивы является значение PagesOnly, запросы будут кешироваться только для выполнения переходов на следующие страницы, а повторные запросы с тем же текстом запроса, параметрами сортировки и группировки будут выполняться снова. Если аргументом директивы является значение RepeatedQueries, повторные запросы с такими же параметрами обрабатываться не будут, а их результат будет извлекаться из кеша. В этом случае кеш запросов должен быть очищен после переиндексирования.

Значение по умолчанию: RepeatedQueries

Dir

Директория для размещения кешированных поисковых запросов.

Значение по умолчанию: системная директория для временных файлов

LifeTime

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

Значение по умолчанию: 60

7.2 Метапоиск и его настройка

Поисковый сервер может работать в так называемом метапоисковом режиме. В этом случае одновременно с основным поиском, настройка которого описана в разделе Директивы конфигурационного файла, выполняются поиски по одному или нескольким дополнительным индексам. Результаты поисков по каждому индексу затем объединяются (сливаются) в окончательный результат, форма представления которого задается точно также, как и в режиме обычного поиска (см. Формирование страниц с результатами поиска и Директивы секции SearchPageTemplate).

Дополнительные индексы для метапоиска и соответствующие им коллекции документов называются метапоисковыми источниками и описываются в секциях SearchSource, по одной секции на индекс. Эти дополнительные индексы должны быть предварительно созданы либо данным Яндекс.Сервером (в этом случае соответствующие коллекции документов описываются в других секция Collection конфигурации Яндекс.Сервера), либо другими Яндекс.Серверами или индексаторами, совместимыми с ним, на этом же или на другом компьютере.

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

Секция SearchSource должна включать одну из директив IndexDir или CgiSearchPrefix. Сначала анализируется наличие директивы IndexDir. Если такая директива есть, данный поисковый источник считается локальным. В противном случае должна присутствовать директива CgiSearchPrefix и поисковый источник считается удаленным. Поиски по локальным источникам выполняются в том же процессе, что и основной поиск. Поиски по удаленным источникам выполняются в своих собственных процессах, работающих на этом же или на других компьютерах. Данный метапоисковый процесс направляет удаленным источникам запросы и получает от них результаты поиска по протоколу HTTP в специальном формате, после чего объединяет полученные результаты в окончательный результат поиска. В рамках одного метапоиска могут присутствовать как локальные, так и удаленные источники.

Директивы секции SearchSource

IndexDir

Указывает полный путь к директории, в которой находится дополнительный индекс для локального поискового источника. Аналогична директиве IndexDir конфигурации коллекции документов.

CgiSearchPrefix

Указывает HTTP-префикс адреса поисковой страницы на удаленном поисковом источнике. Пусть, например, удаленный поисковый источник является коллекцией документов Яндекс.Сервера, установленного на порту 17000 компьютера с интернет-адресом www.metasource.ru. Эта коллекция описывается в секции Collection конфигурационного файла этого удаленного Яндекс.Сервера, имеющей атрибут id со значением name1. Тогда значением данной директивы, описывающим этот удаленный источник, будет http://www.metasource.ru:17000/name1/.

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

MetaSearchOptions

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

Поиск по основному индексу

SearchOnMain

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

DontSearchOnMain

Указывает, что искать по основному индексу не нужно. Тем не менее, этот индекс должен присутствовать.

Значение по умолчанию: SearchOnMain

Метод получения цитат с найденными словами

OneStepQuery

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

TwoStepQuery

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

Значение по умолчанию: OneStepQuery

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

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

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

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

  • Если не выполняется ничего из перечисленного выше, вызывается функция , которая должна установить текст поискового запроса на языке запросов Яндекса. Действия, выполняемые в этой функции, обычно сводятся к преобразованию значений некоторых полей поисковой формы в текст поискового запроса. Реализация функции по умолчанию использует в качестве поискового запроса значение поля text и может быть изменена в процессе настройки сервера.

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

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

7.3.2 Сортировка результата поиска и приоритеты релевантности

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

  • по значению релевантности, определяемой поисковой системой

  • по времени последней модификации документа

  • по значениям группировочного атрибута

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

По умолчанию, сортировка производится независимо для трех разных групп документов, отличающихся степенью соответствия запросу. Этим трем группам соответствуют следующие приоритеты релевантности:

  • совпадение фразы

  • строгое соответствие

  • нестрогое соответствие

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

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

Анатолий /+2 Бышовец

(с целью узнать отчество персоны), то с совпадением фразы найдутся документы, содержащие фрагмент "Анатолий Федорович Бышовец", а документы, включающие фрагмент "Анатолий Бышовец" найдутся всего лишь со строгим соответствием, и поэтому будут иметь более низкий ранг.

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

Нестрогое соответствие запросу может возникнуть, когда в запросе используется оператор нестрогого поиска. В наиболее распространенном случае "документ найден с нестрогим соответствием" означает, что пользователь язык запросов Яндекса не использует, и в этом документе нет ни одного предложения, в котором бы встретились все слова из запроса; есть только предложения, в которых есть самые важные с точки зрения Яндекса слова из запроса (более строго, в этом случае работает алгоритм поиска по кворуму со взвешиванием терминов).

Следует отметить, что по умолчанию приоритеты релевантности учитываются при альтернативных сортировках. Например, в случае, если документы отсортированы по дате модификации, порядок вышеупомянутых трех групп документов не меняется. Т.е. сначала перечисляются все документы с приоритетом "совпадение фразы", отсортированные внутри этой группы по дате, затем - все документы с приоритетом "строгое соответствие", отсортированные внутри этой группы по дате и т.д. Чтобы отменить учет приоритетов при альтернативных сортировках нужно задать в поисковой форме поле np.

7.3.3 Поля поисковой формы, используемые «Яndex.Server 3.4»

Следующие поля задают сортировку, группировку или структурные параметры страницы с результатами поиска и могут самостоятельно устанавливаться пользователями или разработчиками сайта.
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 - значение атрибута для текущей группы, имеет смысл только в случае иерархического атрибута; документы, не имеющие значений атрибута в иерархии указанного значения, выкидываются на этапе выполнения группировки
Заметим, что по умолчанию при выполнении запроса не делается никаких группировок. Для того, чтобы получить ту или иную группировку, необходимо задать поле g. Группировка и сортировка происходят на этапе выполнения запроса, поэтому нельзя использовать функции работы с группами при построении выдачи, если до выполнения поиска не были заданы соответствующие поля.

Следующие поля являются служебными и участвуют в формировании адресов страниц с результатами поиска и подсвеченными документами.
q - идентификатор запроса для следующей страницы
p - номер страницы результатов поиска, начиная с нуля
mime - формат подсвеченного документа
charset - кодировка подсвеченного документа
hldoclist - адрес страницы с результатами поиска, на которой находится ссылка на подсвеченный документ.

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

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

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

sub UserInit

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

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 - номер найденного слова

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

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

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

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()

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

const char *IReqEnv::SearchUrl()
Yx::SearchUrl()

Возвращает префикс веб-страницы, принимающей поисковые запросы. Возвращаемое значение нужно использовать в качестве значения атрибута action html-тага form. Фактически функция возвращает строку вида http://host:port/id, где host и port - значения директив Host и Port секции Server конфигурационного файла Яndex.Server, а id - идентификатор коллекции документов, то есть значение одноименного атрибута секции Collection конфигурационного файла Яndex.Server.

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

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::Status()
Yx::Status()

Возвращает статус выполненного запроса. При успешном поиске - 0.

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

const char *IReqResults::Charset()
Yx::Charset()

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

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

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

Возвращает текущую группу (числовое значение атрибута), заданную при определении группировки.
attr - имя группировочного атрибута
gMode - тип группировки, 1 - плоская или глубокая, если атрибут иерархический, 2 - широкая, имеет смысл только для иерархического атрибута

int ICluster::GroupsOnPageCount(const char *attr, int gMode)
Yx::GroupsOnPageCount(attr, gMode)

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

int ICluster::DocsInGroupCount(const char *attr, int gMode)
Yx::DocsInGroupCount(attr, gMode)

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

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 - номер группы по-порядку, начиная с нуля на первой странице, и с произведения (номер страницы)*(результат вызова GroupsOnPageCount) на последующих.
attr - имя группировочного атрибута
gMode - тип группировки, 1 - плоская или глубокая, если атрибут иерархический, 2 - широкая, имеет смысл только для иерархического атрибута

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

Возвращает число документов, попавших в данную группу в процесе группировки. Так как запоминаются данные не более чем N первых документов, где N - число, возвращаемое функцией DocsInGroupCount(...), то для определения числа документов, которое можно показать для данной группы, надо взять минимум из этих двух чисел.
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 - номер группы по-порядку, начиная с нуля на первой странице, и с произведения (номер страницы)*(результат вызова GroupsOnPageCount) на последующих.
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)

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

double ICluster::DocRelevanceNormalized(int nGroup, int nDoc, const char *attr, int gMode)
Yx::DocRelevanceNormalized(nGroup, nDoc, attr, gMode)

Возвращает релевантность документа, приведенную к диапазону от 0 до 1.

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

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

В данном разделе приведены простейшие примеры использования описанных выше функций на языке C++. Реальные работающие примеры можно найти в файлах output.cpp и outpages.asp, включенных в комплект поставки программы.

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* sc)

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;
}

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

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

sub UserInit

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

sub UserHttpHeaders {
  Yx::ContentType ("text/html; charset=".Yx::Charset());
  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;
}
%>

7.4 Язык запросов «Яndex.Server 3.4»

Язык запросов «Яndex.Server 3.4» совпадает с языком запросов www.yandex.ru.

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

7.4.1 Как трактуются слова

Независимо от того, в какой форме вы употребили слово в запросе, поиск учитывает все его формы по правилам русского языка

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

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

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

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

Так, по запросу 'лужков' будут найдены все документы содержащие формы слов 'лужков' и 'лужок''лужкову', 'лужки', 'лужкам' и т.п. По запросу '!лужков' будут найдены только те документы, что содержат словоформу 'лужков' (но не 'лужковым' и 'лужки'). А по запросу '!!лужков' найдутся документы, содержащие любые формы слова 'лужков', но не слова 'лужок', т.е. найдутся слова 'лужкову', 'лужкова' и т.п., но не 'лужки' и 'лужок').

7.4.2 Естественно-языковый поиск

Самый простой способ задать запрос - просто написать в строке запроса то, что нужно найти. Язык запросов и понятие релевантности в Яndex'е настолько развиты, что позволяют успешно работать с неформальными запросами. Для этого запрос надо заключить в фигурные скобки.

Например, запрос {компьютеры типа башня или tower}, выдаст список документов, относящихся к данной теме, часть которых в свою очередь даст дальнейшие ссылки. В начале списка окажутся документы, где слова запроса встречаются наибольшее количество раз и стоят как можно ближе друг другу.

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

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

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

Например, запрос 'частные объявления продажа велосипедов', выдаст много ссылок на сайты с разнообразными частными объявлениями. А запрос с "+" 'частные объявления продажа +велосипедов' покажет объявления о продаже именно велосипедов.

Если вам нужно описание Парижа, а не предложения многочисленных турагентств, имеет смысл задать такой запрос: 'путеводитель по Парижу -агентство -тур'

Замечание: Обратите внимание на знак '-'. Это именно минус, а не тире и не дефис. Знак '-' надо писать через пробел от предыдущего и слитно с последующим словом, вот так: 'рак -гороскоп'. Если написать 'рак-гороскоп' или 'рак - гороскоп', то знак '-' будет проигнорирован.

7.4.3 Основные операторы

Несколько набранных в запросе слов, разделенных пробелами, означают, что все они должны входить в одно предложение искомого документа. Тот же самый эффект произведет употребление символа '&'.

Например, при запросе 'лечебная физкультура' или 'лечебная & физкультура', результатом поиска будет список документов, в которых в одном предложении содержатся и слово 'лечебная', и слово 'физкультура'. (Эквивалентно запросу '+лечебная +физкультура').

Между словами можно поставить знак '|', чтобы найти документы, содержащие любое из этих слов. (Удобно при поиске синонимов).

Например, запрос вида 'фото | фотография | фотоснимок | снимок | фотоизображение' задает поиск документов, содержащих хотя бы одно из перечисленных слов.

Еще один знак, тильда '~', позволит найти документы с предложением, содержащим первое слово, но не содержащим второе.

Так, по запросу 'банки ~ закон' будут найдены все документы, содержащие слово 'банки', рядом с которым (в пределах предложения) нет слова 'закон'.

Чтобы подняться на ступеньку выше, от уровня предложения до уровня документа, просто удвойте соответствующий знак. Одинарный оператор (&, ~) ищет в пределах предложения, двойной (&&, ~~) - в пределах документа.

Например, по запросу 'рецепты && (плавленый сыр)' будут найдены документы, в которых есть и слово 'рецепты' и словосочетание '(плавленый сыр)' (причем '(плавленый сыр)' должен быть в одном предложении. А запрос 'руководство Visual C ~~ цена' выдаст все документы со словами 'руководство Visual C', но без слова 'цена'

7.4.4 Поиск с расстоянием

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

Например, по запросу 'красная шапочка' будут найдены документы с это фразой. (При этом контекст "а шапочка у нее была красная" найден не будет.)

Как Яndex адресует слова? Если все слова в тексте перенумеровать по порядку их следования, то расстояние между словами A и B - это разница между номерами слов A и B. Таким образом, расстояние между соседними словами равно 1 (а не 0), а расстояние между соседними словами, стоящими "не в том порядке", равно -1. То же самое относится и к предложениям.

Если между двумя словами поставлен знак '/', за которым сразу напечатано число, значит, требуется, чтобы расстояние между ними не превышало этого числа слов.

Например, задав запрос 'поставщики /2 кофе', вы требуете найти документы, в которых содержатся и слово 'поставщики' и слово 'кофе', причем расстояние между ними должно быть не более двух слов, и они должны находиться в одном предложении. (Найдутся 'поставщики колумбийского кофе', 'поставщики кофе из Колумбии' и т.д.)

Если порядок слов и расстояние точно известны, можно воспользоваться пунктуацией '/+n'. Так, например, задается поиск слов, стоящих подряд.

Запрос 'синяя /+1 борода' означает, что слово 'борода' должно следовать непосредственно за словом 'синяя'. (К тому же результату приведет запрос 'синяя борода')

В общем виде ограничение по расстоянию задается при помощи пунктуации вида '/(n m)', где 'n' минимальное, а 'm' максимально допустимое расстояние. Отсюда следует, что запись '/n' эквивалентна '/(-n +n)', а запись '/+n' эквивалентна '/(+n +n)'.

Запрос 'музыкальное /(-2 4) образование' означает, что 'музыкальное' должна находиться от 'образование' в интервале расстояний от 2 слов слева до 4 слов справа.

Практически все знаки можно комбинировать с ограничением расстояния.

Например, результатом поиска по запросу 'вакансии ~ /+1 студентов' будут документы, содержащие слово 'вакансии', причем в этих документах слово 'студентов' не следует непосредственно за словом 'вакансии'.

Когда знаки ограничения по расстоянию стоят после двойных операторов, то употребленные там числа - это расстояние не в словах, а в предложениях. Расстояние в предложениях определяется аналогично расстоянию в словах.

Запрос 'банк && /1 налоги' означает, что слово 'налоги' должно находиться в том же самом, либо в соседнем со словом 'банк' предложении.

7.4.5 Поиск словосочетаний

Вместо одного слова в запросе можно подставить целое выражение. Для этого его надо взять в скобки.

Например, запрос '(история, технология, изготовление) /+1 (сыра, творога)' задает поиск документов, которые содержат любую из фраз 'история сыра', 'технология творога', 'изготовление сыра', 'история творога'.

7.4.6 Поиск в зонах и атрибутах

Поисковые зоны и атрибуты подробно обсуждались в разделе Форматы документов, зоны и атрибуты. Здесь мы приведем список синтаксических правил языка запросов, которые используются для зонно-атрибутивного поиска. В отличие от других синтаксических правил, изложенных в данной главе, операторы зонно-атрибутивного поиска зависят от настроек, использованных при создании индексных файлов. А именно, в них используются имена поисковых зон и атрибутов, заданные в конфигурационных файлах интерпретаторов документных форматов (парсеров). Имена документных атрибутов также могут быть заданы в конфигурационном файле индексатора (см. Набор атрибутов документа).

Ниже в качестве имени зоны мы будем использовать zone, а в качестве имени атрибута - attr. Вместо zone и attr следует подставить одно из значений, определенных в конфигурации парсера. Например, если используется Конфигурация HTML-парсера по умолчанию, можно использовать title или anchor вместо zone и link, image или keywords вместо attr. В примерах данного раздела мы будем предполагать, что документы проиндексированы с использованием конфигурации HTML-парсера по умолчанию.

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

Синтаксические правила зонно-атрибутивного поиска

zone [текст-в-зоне]

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

Пример:

Найти документы, в заголовке которых встречаются слова трава или гриб в любой морфологической форме:

title [трава | гриб]

Пример:

Найти документы, в тексте которых встречается слово ошибка, но это слово не встречается в тексте ссылок на другие документы:

ошибка ~~ anchor [ошибка]

attr = "значение-атрибута"

Ищет документы, в которых существуют зоны (в том числе типов doc и empty), имеющие атрибут типа LITERAL, URL или DATE с именем attr и значением значение-атрибута. В случае атрибута типа DATE нужно использовать формат значения атрибута в виде строки "YYYYMMDD". Чтобы найти не точное значение-атрибута, а значение, начинающееся с заданной подстроки, нужно использовать символ «*».

Пример:

Найти документы, в которых есть картинки, расположенные в файле apple.gif:

image = "apple.gif"

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

Пример:

Найти документы, созданные 14 мая 1999 года:

date="19990514"

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

Пример:

Найти все документы, которые ссылаются на сайт www.site.ru:

link="www.site.ru/*"

В этом примере использован атрибут зоны anchor.

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

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

Пример:

Найти все документы, в которых картинки из файла apple.gif находятся от слова яблоко на расстоянии не большем 1 слова:

image="apple.gif" /1 яблоко

attr < "значение-атрибута"

attr <= "значение-атрибута"

attr > "значение-атрибута"

attr >= "значение-атрибута"

Ищет документы, в которых существуют зоны (в том числе типов doc и empty), имеющие атрибут типа LITERAL, URL или DATE с именем attr и значением, большим или меньшим чем значение-атрибута. Строковые значения атрибутов сравниваются лексикографически.

Пример:

Найти документы, созданные в 2001 году:

date > "20010100" && date <= "20011231"

attr = (слова-атрибута)

Ищет документы, в которых существуют зоны (в том числе типов doc и empty), имеющие атрибут типа TEXT с именем attr, текст которого удовлетворяет запросу слова-атрибута.

Пример:

Найти документы с заданными словами в meta-теге с именем keywords:

keywords=(поисковая система)

zone#attr = "значение-атрибута" [текст-в-зоне]

Ищет текст-в-зоне в зонах с именем zone, имеющих атрибут типа LITERAL, URL или DATE с именем attr и значением значение-атрибута. В подзапросе текст-в-зоне могут употребляться любые языковые конструкции, описанные ранее в данной главе.

Пример:

Найти документы, которые ссылаются на сайт www.site.ru словами "мягкая мебель":

anchor#link="www.site.ru/*" [мягкая мебель]

zone#attr = (слова-атрибута) [текст-в-зоне]

Ищет текст-в-зоне в зонах с именем zone, имеющих атрибут типа TEXT с именем attr, текст которого удовлетворяет запросу слова-атрибута. В подзапросе текст-в-зоне могут употребляться любые языковые конструкции, описанные ранее в данной главе.

Пример:

Найти документы, в которых в HTML-теге address встречаются рядом слова улица Вавилова и при наведении мыши на этот текст в браузере всплывает подсказка, включающая слово институт в любой морфологической форме:

address#tooltip = (институт) [улица /+1 Вавилова]

attr=(слова-атрибута) [текст-в-зоне]

attr="значение-атрибута" [текст-в-зоне]

Ищет текст-в-зоне во всех зонах, имеющих атрибут с именем attr, текст которого удовлетворяет запросу слова-атрибута (для текстовых атрибутов) или совпадает с значение-атрибута (для литеральных атрибутов).

Пример:

Найти документы, в которых встречаются слова улица Вавилова и при наведении мыши на этот текст в браузере всплывает подсказка, включающая слово институт:

tooltip = (институт) [улица Вавилова]

zone#attr = (слова-атрибута)

zone#attr = "значение-атрибута"

Ищет документы, в которых есть зоны с именем zone, имеющие атрибут с именем attr, текст которого удовлетворяет запросу слова-атрибута (для текстовых атрибутов) или совпадает с значение-атрибута (для литеральных атрибутов).

Пример:

Найти документы, в которых встречаются ссылки на другие документы, такие что при наведении мыши на эту ссылку в браузере всплывает подсказка, включающая слово институт:

anchor#tooltip = (институт)

7.4.7 Поиск в найденном

Поставив в поисковой строке '$$_идентификатор_запроса_' можно ограничить область поиска - осуществлять его не по всем документам, а только по тем, которые были найдены в предыдущем поиске. Оператор позволяет последовательно сужать область поиска (при очень узком поиске есть опасность не найти ни одного релевантного документа).

Например, запрос '$Title КомпТек && $$1234567', где '1234567' - идентификатор предыдущего запроса, найдет те документы из последнего результата поиска, у которых в заголовке есть слово 'КомпТек'.

7.4.8 Ранжирование результата поиска

При поиске для каждого найденного документа Яндекс вычисляет величину релевантности (соответствия) содержания этого документа поисковому запросу. Список найденных документов перед выдачей пользователю сортируется по этой величине в порядке убывания. Релевантность документа зависит от ряда факторов, в том числе от частотных характеристик искомых слов, веса слова или выражения, близости искомых слов в тексте документа друг к другу и т.д.

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

Задание веса слова или выражения применяется для того, чтобы увеличить релевантность документов, cодержащих "взвешенное" выражение.

Синтаксис: слово:число или (поисковое_выражение):число

Например, по запросу 'поисковые механизмы:5' будут найдены те же документы, что и по запросу 'поисковые механизмы'. Разница состоит в том, что наверху списка найденного окажутся документы, где чаще встречается именно слово 'механизмы'. Запрос 'поисковые (механизмы | машины | аппараты):5' равнозначен запросу 'поисковые (механизмы:5 | машины:5 | аппараты:5)'.

Задание уточняющего слова или выражения применяется для того, чтобы увеличить релевантность документов, cодержащих уточняющее выражение.

Синтаксис: <- слово или <- (уточняющее_выражение)

Например, по запросу 'компьютер <- телефон' будут найдены все документы, содержащие слово 'компьютер', при этом первыми будут выданы документы, содержащие слово 'телефон'. Если ни в одном документе со словом 'компьютер' нет слова 'телефон', результат запроса будет эквивалентен запросу 'компьютер'.

7.4.9 Краткое описание языка запросов

В заключение сведем все вышесказанное в таблицу. Данным сжатым описанием языка запросов «Яndex.Server 3.4» удобно пользоваться при составлении сложных поисковых выражений и всегда полезно иметь под рукой.

Таблица: Краткое описание языка запросов

Синтаксис Что означает оператор Пример запроса
Пробел или & Логическое И (в пределах предложения) Лечебная физкультура
&& Логическое И (в пределах документа) рецепты && (плавленый сыр)
| логическое ИЛИ фото | фотография | снимок | фотоизображение
( ) группирование слов (технология | изготовление) (сыра | творога)
~ бинарный оператор И НЕ (в пределах предложения) банки ~ закон
~~ бинарный оператор И НЕ (в пределах документа) путеводитель по парижу ~~ (агентство | тур)
/(n m) расстояние в словах (-назад +вперед) поставщики /2 кофе музыкальное /(-2 4) образование вакансии ~ /+1 студентов
" " поиск фразы "красная шапочка" (эквивалентно красная /+1 шапочка)
&&/(n m) расстояние в предложениях (-назад +вперед) банк && /1 налоги

Таблица: Поиск в зонах и элементах

Синтаксис Что означает оператор Пример запроса
$title (выражение) поиск в заголовке $title (CompTek)
title [выражение] поиск в заголовке title [CompTek]
$anchor (выражение) поиск в тексте ссылок $anchor (CompTek | Dialogic)
anchor [выражение] поиск в тексте ссылок anchor [CompTek | Dialogic]
$address (выражение) поиск в тексте адреса $address (Иванов)
address [выражение] поиск в тексте адреса address [Иванов]
#keywords=(выражение) поиск в ключевых словах #keywords=(поисковая система)
#abstract=(выражение) поиск в описании #abstract=(искалка | поиск)
#hint=(выражение) поиск в подписях к изображениям #hint=(lenin | ленин)
#image="имя файла" поиск файла изображения #image="tort*"
#applet="имя файла" поиск файла java-апплета #applet="pref.class"
#style="имя файла" поиск документа в данном стиле #style="mitsu.css"
#url="значение" поиск на заданном сайте (странице) #url="www.comptek.ru*"
#link="значение" поиск ссылок на заданный URL #link="www.yandex.ru*"
#anchor.link="значение" поиск ссылок на заданный URL из обычной ссылки #anchor.link="www.yandex.ru*"
#date="значение" дата создания документа 14.05.1997 #date="19970514"
#date<"значение" дата создания документа до 14.05.1997 #date<"19970514"
#date>"значение" дата создания документа после 14.05.1997 #date>"19970514"
#date<="значение" дата создания документа до 14.05.1997 включительно #date<="19970514"
#date>="значение" дата создания документа после 14.05.1997 включительно #date>>="19970514"
#<имя_раздела>="значение" поиск в разделах, заданных при индексировании #contents="gogol"