# FLUIdS
Структура индексного файла

Индексный файл поисковой системы FLUIdS состоит из заголовка и набора секций:

- строковая информация об индексном файле;
- записи проиндексированных слов (основная база данных)
- трек слов
- список стоп слов
- список действительных слов
- записи проиндексированных файлов
- файловые оффсеты
- файловые структуры

Секции могут быть пустыми (нулевой длинны), однако присутствие в индексном файле заголовка и трека слов обязательно. С учетом четырех нулевых байтов, которые в обязательном порядке записываются в конец секции записей, и четырех-байтового выравнивания секций минимальный размер индексного файла составляет 32 + 4 * 32 + (255 * 2 +2) + 4 или 616 байт.

| Заголовок |

Заголовок индексного файла состоит из двух частей:

общая информация об индексном файле
  Эта информация занимает 32 байта и описывается структурой indexheader_t файла ~/src/fluids/libflu/indxfile.h:

              struct indexheader_t
              {
                unsigned char id[4];
                unsigned char version;
                unsigned char subversion;
                unsigned char checksum;
                unsigned char charset;
                unsigned zint_t wordCount;
                unsigned zint_t fileCount;
                zoff_t fileSize;
                ztime_t timeStamp;
                unsigned char reserved[INDEX_HEADER_RESERVED];
              };

  Здесь:

  - id - содержит признак того, что этот файл является индексным. Индексный файл обязан начинаться с четырех байт, точное значение которых должно быть 'F', 'L', 'U' и '\0'. При попытке работы с файлом, не содержащим подобный признак выдается ошибка "Файл такой-то не находится в формате индексного файла FLUIdS."
  - version и subversion - задают версию индексного файла. Если версия индексного файла не совпадет со значениями INDEX_VERSION и INDEX_SUBVERSION, определяемыми в файле ~/src/defs.h), то будет выдана ошибка "Неподдерживаемая версия индексного файла."
  - checksum - 8-битовая контрольная сумма заголовка. Применяется для контроля целостности заголовка индексного файла.
  - charset - кодировка индексного файла. Индексные файлы могут отличаться по своей кодировке, если они созданы на разных платформах. В дальнейшем будет выбрана единая унифицированная кодировка индексного файла (судя по всему, ею станет кодировка windows-1251, или семейство кодировок windows-*, из-за поддержки в ней всех символов из украинского и белорусского алфавитов).
  - wordCount - число проиндекированных слов.
  - fileCount - число проиндекированных файлов.
  - fileSize - размер индексного файла. Обязан совпадать с реальным размером файла в файловой системе, в противном случае возникнет ошибка "Размер индексного файла не совпадает со значением, указанным в заголовке."
  - timeStamp - время создания индексного файла.
  - reserved - в конце заголовка резервируются 8 байт для использования в будущих версиях.
  Эта информация об индексном файле в удобном для изучения виде может быть получена с помощью программы fldump.

список секционных оффсетов
  Для каждой секции индексного файла указывается ее начало и ее конец в виде прямого смещения относительно начала файла. Конец каждой секции выровнен по четырехбайтовой границе, поэтому начало следующей секции не обязано совпадать с концом предыдущей, откуда и возникает необходимость хранить в индексном файле не только смещение начала секции, но и его конца. Помимо своего прямого назначения - обеспечивать быстрый доступ к секциям, список секционных оффсетов активно используется в момент открытия индксного файла на предмет проверки его целостности.
  В исходных текстах FLUIdS списку секционных оффсетов отвечает элемент offsets структуры indexfile_t (файл ~/src/fluids/libflu/indxfile.h):

            zoff_t offsets[INDEX_OFFSET_COUNT];

  На данный момент `INDEX_OFFSET_COUNT` определена как 32, т.е. максимальное количество разрешенных секций - 16. Из них используется только 8. По мере развития поисковой системы число используемых секций будет возрастать.

| Строковая информация |

При создании индексного файла эта информация берется из директив IndexName, IndexDescription, IndexPointer и IndexAdmin конфигурацинного файла индексации. В настоящий момент никак не используется, однако ее выводит программа fldump.

| Записи проиндексированных слов |

Записи проиндексированных слов - основа индексного файла. Секция состоит из записей вида:

длина записи | проиндексированное слово | ссылка на файл #1 | ссылка на файл #2 | `...` | ссылка на файл #N

То есть каждому проиндексированному слову ставится в соответствие набор проиндексированных файлов, в которых данное слово всречается. Записи располагаются в отсортированном по словам порядке, что позволяет осуществлять поиск по запросам вида "abc*". Каждая ссылка на файл состоит из порядкового номера проиндексированного файла, относительного рейтинга пары слово-файл и "структуры" ссылки (регистр слова и область поиска). Ссылки отсортированы по порядковому номеру файла, что позволяет дополнительно упаковать запись и заодно увеличить скорость поиска.

Ссылка описывается структурой entryitem_t (файл fluids/libflu/entry.h):

            struct entryitem_t
            {
              _fn_t filenum;
              _rn_t rank;
              _st_t structure;
              struct entryitem_t *next;
            };

Сама запись представляется структурой wordentry_t, считывается и записывается подпрограммами ioReadWordEntry и ioWriteWordEntry (файл fluids/libflu/indio.h).

| Трек слов |

| Список стоп слов |

| Список действительных слов |

| Записи проиндексированных файлов |

| Файловые оффсеты |

| Файловые структуры |

На предыдущую страницу | valera@sbnet.ru