Документ как целое может иметь определенные свойства, не связанные непосредственно с его текстом, видимым при просмотре документа. К числу таких свойств относятся, например, дата создания, размер, или принадлежность к определенному разделу сайта или каталога. Много свойств документа может быть связано с его принадлежностью к внешней по отношению к Яndex.Server 3.4 системе классификации или документооборота. Такие свойства документа будем называть документными атрибутами, или просто атрибутами. Каждый атрибут документа получает идентификатор в виде текстовой строки, который в дальнейшем будем называть именем атрибута. Само свойство документа, выражаемое атрибутом, будем называть значением атрибута. Документ, в общем случае, может иметь произвольное число атрибутов. Каждый атрибут документа может иметь несколько различных значений. С другой стороны, не все атрибуты, определенные в коллекции документов, должны быть определены для данного документа.
В Яndex.Server 3.4 имеется два типа документных атрибутов - поисковые и группировочные. Поисковые документные атрибуты являются частным случаем зонных атрибутов и подробно рассмотрены в разделе Форматы документов, зоны и атрибуты. Группировочные атрибуты используются для сортировки и группировки найденных документов и рассматриваются ниже в этой главе.
| Поисковые атрибуты | Группировочные атрибуты |
|---|---|
| Используются для поиска документов. Имена атрибутов используются в языке запросов. | Используются для сортировки и группировки найденных документов. Имена атрибутов используются в полях поисковой формы, формирующей параметры запроса, и в аргументах функций, используемых при формировании страниц с результатами поиска на C++ и Perl, или в атрибутах элементов XML-представления результатов поиска. |
| При создании атрибутов их имена задаются в конфигурации парсера документного формата или в директиве Options конфигурации индексатора. | При создании атрибутов их имена задаются в директиве Groups конфигурации индексатора либо определяются в независимых от индексатора утилитах, формирующих базу группировочных атрибутов. |
| Значения атрибутов сопоставляются с документом при его индексировании. Они либо извлекаются из текста документа в течение индексирования, либо назначаются дополнительно перед окончанием индексирования документа. | Значения атрибутов сопоставляются с документом независимо от индексирования и могут быть изменены без переиндексирования. Тем не менее, они также могут быть извлечены из текста документа при индексировании. |
| Значения атрибутов могут быть последовательностью слов, обрабатываемых с учетом или без учета морфологии, произвольными строками, числами или датами. | Значения атрибутов могут быть только целыми числами. Для удобства конечных пользователей каждому из этих числовых значений может быть сопоставлено строковое имя. |
| Документ может иметь несколько независимых значений данного атрибута. | Документ может иметь несколько значений данного атрибута, которые могут быть независимыми или образовывать иерархию. |
| Значения атрибутов хранятся в том же индексном файле, что и слова, встречающиеся в документе. | Значения атрибутов хранятся в специальном дополнительном файле. |
В процессе формирования результатов поиска множество найденных документов всегда сортируется. По умолчанию сортировка происходит по убыванию релевантности, определяемой поисковой системой. Однако может быть задана сортировка по значению группировочного атрибута, в этом случае она может быть убывающей или возрастающей.
Имеется возможность не только по-разному сортировать список найденных документов, но и структурировать, т.е. группировать этот список по значению атрибута, что делает результат поиска более обозримым и осмысленным. При группировке по атрибуту создается несколько множеств, называемых группами, состоящих из найденных документов. Каждая группа соответствует одному конкретному значению данного атрибута. Группы могут пересекаться, то есть если документ имеет несколько значений атрибута, он попадёт в несколько соответствующих групп. Заметим, что группировка по значениям атрибута, как правило, является осмысленной в случае, когда количество значений атрибута невелико по сравнению с количеством документов.
После выполнения группировки полученные группы сортируются либо по убыванию релевантности, либо по значению некоторого группировочного атрибута, который может отличаться от атрибута, по которому проведена группировка. При сортировке по релевантности, релевантность группы определяется особым алгоритмом, принимающим во внимание релевантности документов, входящих в эту группу. При сортировке по значению атрибута, его значение для группы определяется максимумом значения атрибута среди всех документов группы (при сортировке по убыванию), либо его минимумом (при сортировке по возрастанию). Если для одного документа имеется несколько значений атрибута, то будет использовано одно из них: минимальное или максимальное - в зависимости от "направления" сортировки.
Для одного поискового запроса можно задать сразу несколько группировок, или вариантов структурирования результата. Т.е. можно получить не один "список найденного", а несколько, и каждый список будет соответствовать одной группировке. При этом способ сортировки результата поиска для всех вариантов может быть только один.
Возможность осуществить вложенную группировку (т.е. сгруппировать уже сгруппированный список) отсутствует. Нельзя, например, взять список хостов, получившийся в результате группировки по хостам, и сгруппировать его по категориям каталога. Таким образом группировки результата поиска осуществляются независимо и только по списку найденных документов.
Пример. Результаты поиска по интернету на www.yandex.ru сгруппированы по хостам и по категориям интернет-каталога. Так как документов в интернете примерно на три порядка больше, чем хостов, группировка по хостам значительно увеличивает качество и юзабилити поиска. Структурирование результата поиска по категориям интернет-каталога помогает снимать неоднозначность ответа при неточно сформулированном запросе.
Значения группировочных атрибутов могут образовывать древовидную иерархию. Иерархией будем называть отношение ребёнок → родитель, заданное на множестве значений данного атрибута и отображающее его в себя, такое, что если некоторому документу соответствует значение ребёнок данного атрибута, то ему также соответствует значение родитель. При этом имеется выделенное значение "корня", обязательно равное 0, не имеющее родителя. Группировочные атрибуты, для которых задана иерархия, будем называть иерархическими.
Группировка по одному атрибуту может быть осуществлена одним из 3-х способов.
Отсутствие группировки. Данную группировку можно понимать как группировку специального типа, при которой каждому документу соответствует одна и только одна группа. Понятие пустой группировки позволяет поддержать общность интерфейса при получении несгруппированного списка документов в порядке запрошенной сортировки.
Группировка, при которой создаются несколько несвязных групп. Каждый документ может попасть в одну или несколько таких групп. Используется для неиерархических атрибутов.
Группировка, в которой группы документов образуют иерархию в соответствии со значениями иерархического атрибута. Иерархическая группировка, в свою очередь, бывает двух типов:
Документы попадают в группы, находящиеся на один уровень ниже наперёд заданной группы, которую далее будем называть текущей группой.
Документы попадают на самый нижний уровень, лежащий под текущей группой (в листовые группы).
Пример 6-1. Построение иерархического атрибута
Пусть документам приписана одна из категорий в следующей иерархии. В скобках указаны числовые значения группировочного атрибута.
Каталог (0)
Развлечения и отдых (1)
Спорт (3)
Горные лыжи (8)
Плавание (9)
Знакомства (4)
Путешествия (5)
Туры (10)
Отели (11)
Билеты (12)
Авиа (13)
Ж/д (14)
Компьютеры (2)
Hardware (6)
Software (7)Пусть текущая группа - Развлечения и отдых. Тогда широкая группировка разложит документы по трём группам: Спорт, Знакомства, Путешествия, а глубокая группировка - по семи группам: Горные лыжи, Плавание, Знакомства, Туры, Отели, Авиа, Ж/д.
Пусть теперь текущей группой будет корень каталога (Каталог) Тогда широкая группировка возвращает две группы: Развлечения и отдых и Компьютеры, а глубокая группировка - Горные лыжи, Плавание, Знакомства, Туры, Отели, Авиа, Ж/д, Hardware, Software.
Группировочные атрибуты документов хранятся в специальных файлах, независящих от основного индекса, и могут создаваться или изменяться как в процессе индексирования, так и с помощью постиндексирующих процедур, но до начала поиска. База группировочных атрибутов состоит из следующих файлов:
Основные файлы базы группировочных атрибутов. Во время индексирования могут быть созданы из поисковых атрибутов, имена которых перечислены в директиве Groups конфигурации индексатора.
Чтобы использовать в качестве группировочного атрибут типа DATE, он должен быть распознан с помощью parse_data_integer. После этого в группировках и сортировках будет использовано целое число, имеющее смысл числа секунд, прошедших после 1 января 1970 года.
Пример 1. Будем считать, что иерархия из примера Построение иерархического атрибута соответствует группировочному атрибуту с именем cat, и все индексируемые документы имеют формат HTML и содержат тег
<META NAME="category" CONTENT="значение">где "значение" - одно из целых чисел, указанных в примере. В конфигурации HTML-парсера укажем
<Attributes>
...
cat = TEXT,doc,,ignore/meta.category
</Attributes>
Это означает, что значение meta-тега с именем category будет распознано парсером
как документный атрибут с именем cat. Значение этого атрибута станет известно
в результате индексирования документа, но не будет сохранено в основном индексном файле
(из-за наличия аргумента ignore).
Аргумент ignore позволяет уменьшить размер
индексного файла за счет атрибутов, которые не нужны в языке запросов.
В конфигурации индексатора укажем директиву
Groups: catЭто означает, что документный атрибут cat, определенный парсером при индексировании документа, будет преобразован в одноименный группировочный атрибут, который будет сохранен в базе группировочных атрибутов.
Пример 2. Пусть индексируемые документы являются законодательными актами в формате HTML. Каждому документу соответствует дата его принятия законодателем, по которой требуется искать и сортировать документы. По умолчанию поддерживается поиск и сортировка по дате последнего изменения файла на диске, которая не совпадает с нужной датой. Поэтому сохраняем дату принятия законодателем в следующих meta-тегах:
<META NAME="pub_date_search" CONTENT="значение"> <META NAME="pub_date_group" CONTENT="значение">где "значение" - дата в одном из следующих форматов:
<Attributes>
...
pdat=DATE,doc,parse_http_expires/meta.pub_date_search
pd=DATE,doc,parse_data_integer,ignore/meta.pub_date_group
</Attributes>
В конфигурации индексатора укажем
Groups: pdПоисковый атрибут pdat будет сохранен в индексе в формате, позволяющем задавать поисковые запросы вида #pdat>="19990614". Группировочный атрибут pd будет сохранен в базе группировочных атрибутов, что позволит сортировать документы по дате принятия.
Пример 3. Пусть индексируемые документы принадлежат разным интернет-сайтам и в результатах поиска требуется группировать документы по этим сайтам, то есть показывать только по одному или по несколько документов с каждого сайта. Для простоты рассмотрим случай двух сайтов. В конфигурации индексатора определим две секции, описывающие индексирование каждого сайта:
<IndexedArea>
HttpPrefix http://www.site1.ru/
Options: set host=site1
</IndexedArea>
<IndexedArea>
HttpPrefix http://www.site2.ru/
Options: set host=site2
</IndexedArea>
Для каждого сайта указана начальная страница для обхода по ссылкам и литеральный поисковый
атрибут с именем host и произвольным значением, идентифицирующим сайт. Для преобразования этих
значений в группировочные атрибуты укажем в конфигурации индексатора директиву
Groups: hostс тем же именем атрибута. В данном примере может использоваться конфигурация парсера по умолчанию, так как значения атрибутов определяются в конфигурации индексатора, а не в теле документов. В результате работы индексатора с указанной конфигурацией поисковый атрибут host будет сохранен в индексе в формате, позволяющем находить все документы с данного сайта с помощью запросов вида #host="site1". Одновременно будут автоматически созданы целочисленные значения группировочного атрибута host, которые будут сохранены в базе группировочных атрибутов, что позволит группировать документы по сайтам. Кроме того, будет создан файл соответствия имен host.c2n следующего содержания
1 site1 2 site2
В некоторых случаях значения группировочных атрибутов, представленные целыми числами, бессмысленны с точки зрения пользователя поискового сервиса. В этом случае в результатах поиска требуется показать в качестве значений атрибутов некоторые строки-идентификаторы. Соответствие между значением атрибута и строковым идентификатором этого значения задается в файле с расширением c2n, имя которого совпадает с именем атрибута. Для каждого атрибута создаётся отдельный файл. Каждая строка указанного файла задает одно соответствие. Эта строка имеет формат
(целое число, значение атрибута)(символ табуляции)(текстовая_строка)(символ перевода строки)
Если для значений атрибута не предусмотрено соответствия текстовым строкам, то c2n-файл для этого атрибута отсутствует.
Заданные в c2n-файле имена значений могут быть получены при формировании страниц с результатами поиска на C++ и Perl с помощью функции CategName. В XML-представлении результатов поиска они указываются в атрибуте attr элемента categ.
Пример. Для иерархии из примера Построение иерархического атрибута c2n-файл имеет вид
1 Развлечения и отдых 2 Компьютеры 3 Спорт 4 Знакомства 5 Путешествия 6 Hardware 7 Software 8 Горные лыжи 9 Плавание 10 Туры 11 Отели 12 Билеты 13 Авиа 14 Ж/д
Файлы c2p используются только для иерархических атрибутов и состоят из строк формата:
(целое число, значение "ребенок")(символ табуляции)(целое число, значение "родитель")(символ перевода строки)Каждая строка задает одно иерархическое соответствие ребёнок → родитель. Для каждого атрибута создаётся отдельный файл.
Если атрибут не является иерархическим, то c2p-файл для него отсутствует.
Заданные в c2p-файле значения могут быть получены при формировании страниц с результатами поиска на C++ и Perl с помощью функции CategParent. В XML-представлении результатов поиска иерархия атрибутов для данного документа представлена в виде вложенных элементов categ.
Пример. Для иерархии из примера Построение иерархического атрибута c2p-файл имеет вид
1 0 2 0 3 1 4 1 5 1 6 2 7 2 8 3 9 3 10 5 11 5 12 5 13 12 14 12
Все описанные файлы должны находиться в той же директории, что и основные индексные файлы.
Техническое замечание. С точки зрения эффективности реализации желательно, чтобы диапазон значений группировочных атрибутов был как можно более "компактен" и его нижняя граница была недалека от нулевого значения.
Максимальное число группировочных атрибутов равно 20. Максимальное число уровней в иерархии данного атрибута равно 10. Максимальное число значений данного атрибута, которое может иметь документ, равно 20 (без учета верхних уровней возможной иерархии). Все эти значения определяются параметрами компиляции и могут быть изменены по требованию заказчика.