Формат файла .l01 (Словарь ИРБИС64 - Листовые узлы дерева поиска)


НАЧАЛО >> Нативный провайдер данных DP_Irbis64Native >> Формат файла .l01 (Словарь ИРБИС64 - Листовые узлы дерева поиска)📄 Скачать в DOCX


Файл .l01 является частью инвертированного файла (словаря) системы ИРБИС64. Он содержит листовые узлы (leaves) B-дерева. В отличие от индексного файла .n01, элементы которого перенаправляют поиск на подуровни дерева, записи в файле .l01 содержат сами термины словаря и указывают непосредственно на списки ссылок (постингов) в файле .ifp.

1. Физическая структура

Как и .n01, файл логически разбит на блоки фиксированного размера. Размер одного блока (SIZE_OF_TERMS_BLOCK) составляет 2048 байт.

1.1. Порядок байт (Endianness)

Все бинарные числовые значения в файле записываются на диск в формате Big-Endian (старший байт по меньшему адресу).

2. Структура отдельного блока (Node)

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

[Заголовок блока] [Массив указателей на ключи] ... [Свободное пространство] ... [Сами ключи (термины)]

Ключи добавляются с конца блока (навстречу заголовкам), а массив заголовков ключей растет от начала.

2.1. 1. Заголовок блока (Header_block)

Заголовок блока (THeader_Block) всегда располагается в начале блока и занимает 16 байт.

Поле Тип Размер Описание
number int 4 байта Номер текущего блока в файле .l01.
prev int 4 байта Номер предыдущего блока .l01 по алфавиту (двусвязный список). Используется для функции последовательного сканирования словаря назад (IrbisPrevTerm). Отрицательное значение или 0 означает начало списка.
next int 4 байта Номер следующего блока .l01 по алфавиту. Используется для функции последовательного сканирования словаря вперед (IrbisNxtTerm). Отрицательное значение или 0 означает конец списка.
terms unsigned short 2 байта Количество терминов (ключей), содержащихся в текущем блоке.
offset_free unsigned short 2 байта Смещение на свободное пространство от начала блока. Указывает на границу, до которой записаны ключи со стороны конца блока.

2.2. 2. Заголовок ключа (Header_key)

Следом за Header_block идет массив элементов Header_key (THeader_Key), по одному на каждый термин в блоке. Описание одного элемента занимает 12 байт.

Поле Тип Размер Описание
len unsigned short 2 байта Длина ключа (термина). Максимальная длина термина ограничена 255 символами.
offset_key unsigned short 2 байта Смещение на начало ключа (строки символов) относительно начала блока.
nxt TInt64 (struct) 8 байт 64-битное число, записанное в виде двух 32-битных частей. На диске сначала располагается LowWord (4 байта), а затем HiWord (4 байта). В листовом файле .l01 это значение интерпретируется как абсолютное смещение в байтах (или указатель) на первую запись со списком постингов (ссылок на MFN) для данного термина в файле .ifp.

2.3. 3. Термины (Ключи)

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

3. Расчет свободного места

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

Свободно = offset_free - (terms * 12) - 16

4. Особенности навигации

Наличие двусвязного списка (prev и next в THeader_Block) позволяет базе данных ИРБИС быстро и эффективно производить навигацию по словарю в прямом и обратном направлении (получение соседних терминов), не выполняя каждый раз полный обход дерева от корня (из файла .n01).