НАЧАЛО >> Нативный провайдер данных DP_Irbis64Native >> Формат файла .l01 (Словарь ИРБИС64 - Листовые узлы дерева поиска)📄 Скачать в DOCX
Файл .l01 является частью инвертированного файла (словаря) системы ИРБИС64. Он содержит листовые узлы (leaves) B-дерева. В отличие от индексного файла .n01, элементы которого перенаправляют поиск на подуровни дерева, записи в файле .l01 содержат сами термины словаря и указывают непосредственно на списки ссылок (постингов) в файле .ifp.
Как и .n01, файл логически разбит на блоки фиксированного размера.
Размер одного блока (SIZE_OF_TERMS_BLOCK) составляет 2048 байт.
Все бинарные числовые значения в файле записываются на диск в формате Big-Endian (старший байт по меньшему адресу).
Внутренняя организация блока полностью идентична блокам .n01:
[Заголовок блока] [Массив указателей на ключи] ... [Свободное пространство] ... [Сами ключи (термины)]
Ключи добавляются с конца блока (навстречу заголовкам), а массив заголовков ключей растет от начала.
Заголовок блока (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 байта | Смещение на свободное пространство от начала блока. Указывает на границу, до которой записаны ключи со стороны конца блока. |
Следом за 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. |
Сами строковые значения ключей записываются, начиная с конца блока. Значение смещения для каждого термина определяется в поле offset_key. Термины хранятся в отсортированном виде внутри блока.
Свободное (незанятое) пространство в блоке вычисляется по той же формуле, что и в индексных блоках:
Свободно = offset_free - (terms * 12) - 16
Наличие двусвязного списка (prev и next в THeader_Block) позволяет базе данных ИРБИС быстро и эффективно производить навигацию по словарю в прямом и обратном направлении (получение соседних терминов), не выполняя каждый раз полный обход дерева от корня (из файла .n01).