Индексатор, используемый в Яndex.Server 3.4, разработан так, чтобы индексировать документы произвольного формата. С этой целью чтение документа и интерпретация его формата осуществляется с помощью отдельных модулей, по одному модулю на каждый формат документа. Эти интерпретирующие формат модули в дальнейшем называются парсерами.
В состав стандартной поставки Яndex.Server 3.4 входят парсеры форматов text/html и text/plain, в настоящее время доступны также парсеры форматов XML, RTF, PDF, MP3, FLASH, MS Word, MS Excel, MS PowerPoint. Кроме того, доступна спецификация интерфейса, которая позволяет независимым производителям разработать нужные парсеры.
Каждый документ имеет внутреннюю структуру - деление на параграфы, абзацы, заголовки и т.п. Например, формат электронного письма подразумевает наличие в нем полей from, to, служебных областей, поля сообщения и т.п. Документы принятого в интернете формата HTML также имеют внутреннюю структуру - заголовок, тело документа, ключевые слова. В теле могут присутствовать заголовки различных уровней, ссылки, картинки и т.д. Различные части структурированых таким образом документов будем называть зонами.
Каждая зона может иметь одно или несколько скрытых свойств, не связанных непосредственно с ее текстом. Например, зона to в электронном письме могла бы иметь свойство количество адресов рассылки, а зона ссылка на другой документ в HTML-документе имеет свойство URL документа. Такие свойства зон будем называть атрибутами.
Основная задача парсера - выделить из документа нужный для индексирования текст. Текст, выделяемый парсером, может быть помечен как принадлежащий определенной зоне документа, или как имеющий определенные свойства (атрибуты). На основании элементов форматирования документа парсер может указать границы предложений и абзацев, а также вес данного отрывка текста. Ниже мы рассмотрим зоны и атрибуты более подробно.
Документ размечается на зоны во время индексирования, в соответствии с метками, возвращаемыми парсером. Каждая зона получает уникальное имя (текстовую строку), используемое в языке запросов, и может быть предметом поиска независимо от других зон. Мы будем называть эти размеченные области документа поисковыми зонами. Каждая поисковая зона имеет точки начала и конца в теле документа. Начало и конец зон всегда приходятся на границы слов. Разные зоны могут быть вложены друг в друга.
Свойства (атрибуты) зон также могут быть помечены в качестве независимых объектов поиска. Такие свойства зон будем называть поисковыми атрибутами, или просто атрибутами. Каждый атрибут имеет уникальное имя (текстовую строку), и значение, которое может быть различного типа, в зависимости от способа его обработки при индексировании. Зона, в общем случае, может иметь произвольное число атрибутов. Каждый атрибут может иметь несколько различных значений. Разумеется, не все атрибуты, определенные в данном массиве документов, должны быть определены для данной зоны. Язык запросов Яндекса позволяет искать в нужной зоне с нужным значением атрибута. Значения атрибутов назначаются зонам во время индексирования, в соответствии с метками, возвращаемыми парсером, и хранятся в том же индексном файле, что и слова, встречающиеся в документе.
Существуют два важных частных случая зон - документ как целое и зона нулевой длины. Атрибуты документа как целого называются документными атрибутами. Примерами документных атрибутов являются размер документа, его автор, дата создания или принадлежность к определенному разделу сайта. Поиск по таким атрибутам является важным частным случаем зонно-атрибутивного поиска. Назначение документных атрибутов возможно не только во время индексирования, как для других зон, но и дополнительно, в конфигурационном файле индексатора (см. подраздел Набор атрибутов документа раздела Директива Options главы Ключи конфигурационного файла индексатора).
Зона нулевой длины введена для того, чтобы иметь возможность назначить атрибуты определенной точке внутри документа. Это может быть полезным в случае, когда документ имеет "вложенные потоки", отличающиеся форматом или медиа-типом и не индексируемые с помощью основного парсера. Например, у картинок в HTML-документе может быть всплывающий сверху текст - параметр alt тега <img>. Этот текст - свойство (атрибут) точки документа, в которой расположена картинка.
Пример 5-4. Документные атрибуты
Рассмотрим массив из двух документов, включающих литературные произведения. Каждый из них имеет документный атрибут datecreated, имеющий значение даты написания произведения его автором. Первый документ имеет атрибут author со значением Pushkin, а у второго документа этот атрибут имеет два значения - Shecly и Zelazny, так как произведение написано в соавторстве. Наконец, у первого документа имеется атрибут in_meter со значением iambus, а у второго документа этот атрибут отсутствует.
По способам распознавания и обработки различаются следующие типы атрибутов:
Значение атрибута распознается как текст, состоящий из последовательности слов, каждое слово обрабатывается с учетом морфологии и участвует по-отдельности в индексировании и поиске. Такие атрибуты будут называться атрибутами типа TEXT.
Значение атрибута распознается как неделимая последовательность символов, участвующая в индексировании и поиске как целое. Правила морфологии к такой последовательности не применяются. Такие атрибуты будут называться атрибутами типа LITERAL. Для данного типа атрибутов возможен поиск в интервале значений, с учетом лексикографического сравнения.
Значение атрибута распознается как дата или время. Такие атрибуты будут называться атрибутами типа DATE.
Значение атрибута распознается как Uniform Resource Locator. Такие атрибуты будут называться атрибутами типа URL.
Значение атрибута распознается как целое число. Такие атрибуты будут называться атрибутами типа INTEGER.
Пример 5-5. Типы атрибутов
Некоторый документ имеет атрибут abstract типа TEXT со значением "A general formula is derived for the main gravitomagnetic clock effect in the case of slow motion along an arbitrary elliptical orbit in the exterior field of a slowly rotating mass", атрибут field типа LITERAL со значением "General Relativity and Quantum Cosmology", атрибут publication_date типа DATE со значением "12 Oct 2001 00:00:02 GMT" и атрибут gr-qc типа LITERAL со значением 0110055, идентифицирующий этот документ в международной базе научных публикаций xxx.lanl.gov.
Конфигурирование зон и атрибутов является частью настройки парсера соответствующего документного формата. В конфигурации зон и атрибутов должно быть определено, какие части документа и при каких условиях следует считать поисковыми зонами, какие свойства этих зон следует считать поисковыми атрибутами и индексировать, какой они имеют тип и по каким дополнительным правилам их надо преобразовывать перед занесением в индексные файлы. Кроме того, зонам и атрибутам присваиваются имена для того, чтобы иметь возможность обратиться к ним при помощи языка запросов.
Конфигурация зон и атрибутов, встроенная в парсеры по умолчанию, достаточна для подавляющего большинства случаев. Однако если необходимо работать с какими-либо специфическими данными, содержащимися в документах, можно изменить эту конфигурацию, описав новое поведение в конфигурационном файле соответствующего парсера. Для этого в секциях DocFormat конфигурационного файла индексатора нужно задать файл конфигурации парсера соответствующего формата. После этого нужно отредактировать конфигурацию парсера в соответствии с его документацией. Настройка парсера формата HTML описана в разделе Конфигурация HTML-парсера, а настройка парсера формата XML описана в разделе Конфигурация XML-парсера.
Ряд документных атрибутов попадают в индекс независимо от настроек парсеров и не требуют никаких действий по их описанию. К таким атрибутам относятся дата последнего изменения файла с документом (date), дата последнего переиндексирования документа (idate) и некоторые другие.
Механизм индексирования с получением новых ссылок из ранее проиндексированных документов ("сетевой паук") работает, только если определены атрибуты link, и в качестве ссылок используются значения этих атрибутов.
Функция, возвращающая заголовок документа на странице с результатами поиска, работает только в том случае, если при индексировании документа была определена поисковая зона title, содержащая не менее одного предложения и являющаяся границей абзаца.
Функция, возвращающая аннотацию документа на странице с результатами поиска, фактически возвращает документный атрибут abstract, если он был определен в настройках парсера, а в противном случае первые несколько предложений документа.
Конфигурация HTML-парсера проектируется в соответствии с типичными поисковыми задачами, которые могут возникнуть для данной коллекции документов. В процессе разработки конфигурации рекомендуется придерживаться следующих основных шагов.
Определить имена поисковых зон и поисковых атрибутов, которые будут участвовать в языке запросов.
Для каждой поисковой зоны указать список имен HTML-тегов, содержимое которых должно принадлежать данной поисковой зоне.
Определить, будут ли некоторые поисковые зоны условными. Условными будем называть поисковые зоны, образуемые только при наличии заданного поискового атрибута. Для списка HTML-тегов, определяющего поисковую зону, может быть дополнительно указано имя некоторого поискового (не HTML!) атрибута. Если имя указано, и при попытке создать поисковую зону из содержимого данного HTML-тега эта зона не получает поискового атрибута с указанным именем (и любым значением), то поисковая зона не создается.
Пример: Пусть поисковой зоне anchor должен принадлежать текст документа, находящийся внутри тега <a>...</a>, но только при условии, что данный текст ссылается на другой документ. Для этого данный тег должен иметь HTML-атрибут href. Поэтому определим поисковую зону anchor как условную, возникающую только при наличии поискового атрибута link, описанного в следующем примере.
Для каждого поискового атрибута выбрать его тип (из числа описанных в разделе Типы атрибутов) и список пар (имя HTML-тега, имя HTML-атрибута этого тега). Если у HTML-тега, имя которого совпадает с первым именем в паре имеется HTML-атрибут, имя которого совпадает со вторым именем в паре, то значение этого HTML-тега распознается как значение определяемого поискового атрибута по правилам, специфичным для указанного типа поискового атрибута.
Конфигурация парсера, спроектированная в примерах данного раздела, имеет следующий вид.
<HtmlParser>
<Zones>
header = h1,h2,h3
anchor = a/link
</Zones>
<Attributes>
link = URL,any/a.href,frame.src
</Attributes>
</HtmlParser>
Формальные правила описания конфигурации приведены в следующем разделе.Описание настроек HTML-парсера можно размещать как в общем конфигурационном файле, так и в отдельном файле. В любом случае в секции DocFormat конфигурационного файла индексатора нужно задать путь к файлу конфигурации парсера. Вся конфигурация парсера должна быть размещена внутри секции <HtmlParser>. Директивы, определяющие поисковые зоны, располагаются внутри подсекции <Zones>, а директивы, определяющие поисковые атрибуты - внутри подсекции <Attributes>.
Далее приводятся формальные правила написания конфигураций, и даются конкретные примеры с подробными комментариями.
Формальные правила описания зон можно представить следующим набором выражений:
<Zones>
yxzone = htelem (,htelem)*
yxzone = htelem (,htelem)* /yxattr
</Zones>
Где
| yxzone - имя поисковой зоны |
| htelem - имя HTML-тега |
| yxattr - имя поискового атрибута, определяющего условную поисковую зону |
| (...)* - ноль, один или несколько элементов |
Имя поисковой зоны не может совпадать с одним из зарезервированных имен doc, empty, any. Вместо имени HTML-тега допустимо использовать символ _ (подчеркивание). Он означает любой тег.
Формальные правила описания поисковых атрибутов можно представить следующим набором выражений:
<Attributes>
yxattr = TYPE/htelem.htattr(,htelem.htattr)*
yxattr = TYPE,yxzone/htelem.htattr(,htelem.htattr)*
yxattr = TYPE,yxzone,function/htelem.htattr(,htelem.htattr)*
yxattr = TYPE,yxzone,function,ignore/htelem.htattr(,htelem.htattr)*
;только для атрибутов типа URL
yxattr = TYPE,yxzone,function,ignore,ext( ext)*/htelem.htattr(,htelem.htattr)*
yxattr = TYPE,yxzone,function,ignore,ext( ext)*,local/htelem.htattr(,htelem.htattr)*
</Attributes>
Где
| yxzone - имя поисковой зоны |
| yxattr - имя поискового атрибута |
| htelem - имя HTML-тега |
| htattr - имя HTML-атрибута |
| (...)* - ноль, один или несколько элементов |
| TYPE - тип поискового атрибута, как описано в разделе Типы атрибутов |
| function - одно из строковых значений, указанных ниже, определяющих правила распознавания текста атрибута |
| ignore - флажок, указывающий, что документный атрибут надо распознавать, но не надо запоминать его в индексных файлах. Используется для создания группировочных атрибутов. |
| ext - список расширений имен файлов разделенных пробелами |
| local - флажок для пометки только локальных (внтурисайтовых) ссылок |
Символ _ (подчеркивание) вместо имени HTML-тега или HTML-атрибута обозначает любой элемент или атрибут. Если символ _ задан вместо имени поискового атрибута, имя поискового атрибута будет совпадать с именем HTML-атрибута.
Пример: Многие HTML-теги могут иметь всплывающую подсказку, заданную через HTML-атрибут title. Чтобы проиндексировать все эти атрибуты, можно определить поисковый атрибут tooltip следующим образом:
tooltip = TEXT/_.titleКаждое из слов текста атрибута title любого HTML-тега войдет в индекс с учетом морфологии.
Особый случай представляют собой теги <META> и <LINK>. Для удобства их использования принято, что именем атрибута тега <META> является значение атрибутов NAME или HTTP-EQUIV, а значением - содержимое атрибута CONTENT. Для тега <LINK> именем атрибута считается значение атрибутов REL/REV, а значением - содержимое атрибута HREF.
Пример: Каждый документ в электронной библиотеке содержит meta-тег следующего вида:
<meta name="author" content="_имя_автора_">Чтобы обеспечить поиск документов, принадлежащих конкретному автору, определим поисковый атрибут author:
author = TEXT/meta.author
Если название поисковой зоны после типа атрибута опущено, поисковый атрибут будет документным атрибутом. Если имя поисковой зоны указано, возможны следующие случаи.
| Значение | Описание |
|---|---|
| doc | это документный атрибут, тот же самый результат получается, если имя зоны не указывать |
| empty | это атрибут данной точки документа, то есть атрибут специальной зоны нулевой длины, как обсуждалось в Поисковые зоны и атрибуты |
| any | если для содержимого данного HTML-элемента сформирована поисковая зона, поисковый атрибут является атрибутом этой зоны. В противном случае это атрибут данной точки документа. |
| другое имя | если из содержимого HTML-элемента не сформирована поисковая зона с данным именем, поисковый атрибут не создается |
Пример: Для поиска картинок по именам файлов определим поисковый атрибут image:
image = URL,empty/img.src
Аргумент function может принимать следующие значения:
| Значение | Описание |
|---|---|
| parse_http_expires | распознавать текст атрибута по правилам, применяемым для meta.expires |
| parse_http_refresh | распознавать текст атрибута по правилам, применяемым для meta.refresh |
| parse_http_charset | распознавать текст атрибута по правилам, применяемым для meta.content-type |
| parse_meta_robots | распознавать текст атрибута по правилам, применяемым для meta.robots |
| parse_data_integer | распознавать текст атрибута как дату и время и преобразовывать результат в целое число |
Имена поисковых атрибутов типа URL могут определяться не только наличием или отсутствием соответствующих тегов и их атрибутов, но и расширениями имен файлов, составляющих значение HTML-атрибута, а также фактом, является ли ссылка локальной для данного сайта или уходит на внешние ресурсы.
Пример: Создадим дополнительные поисковые атрибуты для случаев, когда HTML-атрибут представляет собой внутрисайтовую ссылку или ссылается на музыкальный файл:
; По умолчанию - расширения не даны link = URL,anchor/a.href link = URL,any/frame.src,iframe.src,area.href ; В случае музыкальных расширений или внутренних ссылок меняем имя атрибута linkmp3 = URL,anchor,,,mp3 mpga mp2 ra/a.href linkint = URL,anchor,,,,local/a.href linkint = URL,any,,,,local/frame.src,iframe.src,area.hrefЕсли в конфигурации зон сформирована условная зона anchor по правилу
anchor = a/linkто текст внутрисайтовых и музыкальных ссылок в эту зону не попадет.
Ниже приведен пример конфигурационного файла для HTML-парсера. Данная настройка соответствует поведению парсера по умолчанию, то есть будет использоваться в случае, если дополнительная конфигурация парсера не указана.
<HtmlParser>
<Zones>
title = title
address = address
anchor = a/link
</Zones>
<Attributes>
_ = LITERAL/meta._
link = URL,anchor/a.href
link = URL,any/frame.src,iframe.src,area.href
link = URL/link._
robots = LITERAL,doc,parse_meta_robots,ignore/meta.robots
refresh = URL,doc,parse_http_refresh,ignore/meta.refresh
style = URL/link.stylesheet
profile = URL/head.profile
script = URL,any/script.src
image = URL,any/img.src
applet = URL,any/applet.code,applet.object
object = URL,any/object.data,object.classid
abstract = TEXT/meta.description
keywords = TEXT/meta.keywords
hint = TEXT,any/img.alt,area.alt
tooltip = TEXT,any/_.title
</Attributes>
</HtmlParser>В процессе разработки конфигурации XML-парсера рекомендуется придерживаться тех же основных шагов, что подробно описаны в разделе Проектирование конфигурации HTML-парсера:
Определить имена поисковых зон и поисковых атрибутов, которые будут участвовать в языке запросов.
Для каждой поисковой зоны указать список имен XML-элементов, содержимое которых должно принадлежать данной поисковой зоне. Определить, будут ли некоторые поисковые зоны условными.
Для каждого поискового атрибута выбрать его тип и список пар (имя XML-элемента, имя XML-атрибута этого элемента), определяющих атрибут.
Дополнительно, для каждого XML-элемента можно определить способ обработки текста - границы слов и абзацев, способ обработки пробелов и вес слов.
Описание настроек XML-парсера можно размещать как в общем конфигурационном файле, так и в отдельном файле. В любом случае в секции DocFormat конфигурационного файла индексатора нужно задать путь к файлу конфигурации парсера. Вся конфигурация парсера должна быть размещена внутри секции <XmlParser>. Эта секция включает одну или несколько подсекций <DOCTYPE>, каждая из которых определяет конфигурацию, относящуюся к заданному типу XML-документов и включает, в свою очередь, подсекции <Zones>, <Attributes> и <TextFlags>.
Правила интерпретации каждого типа XML-документов описываются в отдельной секции <DOCTYPE>. Каждая такая секция может иметь атрибуты public, system и root. Анализ значений этих атрибутов позволяет установить соответствие между данным XML-документом и нужными настройками парсера. Сначала анализируется атрибут public, который, в случае своего наличия, содержит подстроку, содержащуюся в значении одноименного атрибута элемента <DOCTYPE> XML-документа. Если соответствие не найдено, аналогичный анализ проводится для атрибутов system. Если соответствие опять не найдено (это может случиться, в частности, если элемент <DOCTYPE> отсутствует в XML-документе), сравнивается значение атрибута root секции <DOCTYPE> конфигурационного файла и имени корневого элемента XML-документа.
Если ни одна из секций <DOCTYPE> конфигурационного файла, имеющая атрибуты, не соответствует XML-документу, будет использована конфигурация, описанная в секции без атрибутов. Если секция <DOCTYPE> без атрибутов отсутствует, будет использована конфигурация, описанная в разделе Конфигурация по умолчанию.
Формальные правила описания зон можно представить следующим набором выражений:
<Zones>
yzone = xelem (,xelem)*
yzone = xelem (,xelem)* /yattr
</Zones>
Где
| yzone - имя поисковой зоны |
| xelem - имя XML-элемента |
| yattr - имя поискового атрибута, определяющего условную поисковую зону |
| (...)* - ноль, один или несколько элементов |
Имя поисковой зоны не может совпадать с одним из зарезервированных имен doc, empty, any. Вместо имени XML-элемента допустимо использовать символ _ (подчеркивание), который означает любой XML-элемент. Если символ _ употреблен вместо имени поисковой зоны, это значит, что имя поисковой зоны совпадает с именем XML-элемента.
Формальные правила описания поисковых атрибутов можно представить следующим набором выражений:
<Attributes>
yattr = TYPE/xelem.xattr(,xelem.xattr)*
yattr = TYPE,yzone/xelem.xattr(,xelem.xattr)*
yattr = TYPE,yzone,function/xelem.xattr(,xelem.xattr)*
yattr = TYPE,yzone,function,ignore/xelem.xattr(,xelem.xattr)*
</Attributes>
Где
| yzone - имя поисковой зоны, как описано в разделе Конфигурация HTML-парсера |
| yattr - имя поискового атрибута |
| xelem - имя XML-элемента |
| xattr - имя XML-атрибута |
| (...)* - ноль, один или несколько элементов |
| TYPE - тип поискового атрибута, как описано в разделе Типы атрибутов |
| function - одно из строковых значений, описанных в разделе Конфигурация HTML-парсера и определяющих правила распознавания текста атрибута |
| ignore - флажок, указывающий, что документный атрибут надо распознавать, но не надо запоминать его в индексных файлах. Используется для создания группировочных атрибутов. |
Символ _ (подчеркивание) вместо имени XML-элемента или XML-атрибута обозначает любой элемент или атрибут. Если символ _ задан вместо имени поискового атрибута, имя поискового атрибута будет совпадать с именем XML-атрибута.
Формальные правила обработки текста можно представить следующим набором выражений:
<TextFlags>
ybreak = (xelem)* (, xelem.xattr)* (, xelem.xattr.xval)*
</TextFlags>
Где
| ybreak - один из флагов обработки текста, перечисленных ниже |
| xelem - имя XML-элемента |
| xattr - имя XML-атрибута |
| xval - значение XML-атрибута |
| (...)* - ноль, один или несколько элементов |
Флажки обработки текста
Определяет, будет ли текст внутри XML-элемента отделен границами слова, предложения или абзаца в дополнение к обычным пунктуационным правилам.
Значение по умолчанию: BREAK_NONE
Определяет, значимы ли пробельные символы в тексте внутри XML-элемента.
Значение по умолчанию: SPACE_DEFAULT
Определяет относительный вес слов в тексте внутри XML-элемента. В случае значения WEIGHT_ZERO текст проиндексирован не будет.
Значение по умолчанию: WEIGHT_NORMAL
Важно: Чтобы у найденного документа было определено свойство "заголовок документа", необходимо, чтобы в настройках парсера была определена зона title с флагом обработки текста BREAK_PARAGRAPH, и документ содержал не менее одного предолжения в этой зоне.
Ниже приведен пример конфигурационного файла для XML-парсера. Данная настройка соответствует поведению по умолчанию - она будет использоваться в случае, если дополнительная конфигурация парсера не указана.
<XmlParser>
<DOCTYPE>
<Zones>
!все XML-элементы образуют поисковые зоны с таким же именем
_ = _
</Zones>
<Attributes>
!для всех зон все XML-атрибуты соответствующих элементов образуют поисковые зонные атрибуты
!с таким же именем, как имя XML-атрибута и типом TEXT
_ = TEXT,any/_._
</Attributes>
<TextFlags>
!все XML-элементы независимо от XML-атрибутов и их значений разбивают текст на абзацы
BREAK_PARAGRAPH = _._
</TextFlags>
</DOCTYPE>
</XmlParser>Ниже приведен пример секции <DOCTYPE>, которая может быть использована при индексировании WML-документов (см. http://www.wapforum.org/DTD/wml12.dtd).
<DOCTYPE public="DTD WML 1.2">
LocalDTD = wml12.dtd
<Zones>
anchor = anchor, a, go, card, option / link
</Zones>
<Attributes>
link = URL,anchor/_.href,card.ontimer,card.onenterforward,card.onenterbackward,option.onpick
title = TEXT,doc/card.title
</Attributes>
<TextFlags>
BREAK_PARAGRAPH = br, table, tr, td
</TextFlags>
</DOCTYPE>| Пред. | Начало | След. |
| Конфигурация HTTP-запросов | Уровень выше | Внешние источники данных |