# FLUIdS
Что нового

- 14.02.00: готовится к выходу версия 4.0.
- 14.02.00: вышла версия 3.11.4.
- 16.07.99: вышла версия 3.11.3.
- 05.04.99: вышла версия 3.11.2.
- 02.04.99: создан список рассылки `fluids-announce`.
- 15.03.99: вышла версия 3.11.1.
- 03.03.99: появилась версия 3.11.
- 21.11.98: вышла версия 3.10.4. Если более ошибок выявлено не будет, то скорее всего это - последняя версия серии 3.x.
- 16.11.98: вышла версия 3.10.3.
- 30.11.98: вышла версия 3.10.2.
- 23.11.98: вышла версия 3.10.1.
- 16.11.98: вышла версия 3.10.
- 01.11.98: вышла версия 3.9.2.
- 19.10.98: вышла версия 3.9.1.

| Готовится версия 4.0 |

После более чем полугодового перерыва возобновилась работа над совершенствованием поисковой системы, результатом которой стал выпуск альфа-версии 4.0. По сравнению с 3.x в систему внесен целый ряд архитектурных изменений:

- Формат индексного файла наконец-то стал платформо-независимым (по крайней мере, я на это сильно надеюсь :).
- Создана эмуляция поиска с учетом регистра ключевых слов. Поисковая система теперь разпознает 4 разновидности слов:
    все буквы в слове - строчные (например, weekend, 11th);
    все буквы в слове - прописные (например, ММВБ, МОДУЛЬ0);
    первая буква в слове - прописная, остальные - строчные (например, Apache, Иванов, Н0ль);
    все остальное (например, 3DStudio, FLUIdS). В этом последнем случае не делается различия между словами, отличающимися написанием строчных и прописных букв (например, слова FLUIdS и FLUiDS считаются эквивалентными).
- Усовершенствован формат индексного файла. В результате скорость поиска возрасла от полутора до нескольких раз.
- В ключевых словах поиска можно применять метасимволы `*` и `?` (в любом месте ключевого слова. И даже в начале, если при компиляции в файле ./src/cfg.h определен параметр SUBWORD_SEARCH). Ранее разрешен был только метасимвол `*`, и только на конце ключевых слов.
- Возможно применение нескольких своп-файлов при индексации, возрасла и скорость своппинга. В результате время индексации для больших объемов информации существенно сократилось.
- Размер индексного файла в этой версии минимален. Дальнейшее развитие поисковой системы будет приводить только к его росту.
- Исходные тексты библиотек и исполняемых модулей переписаны таким образом, чтобы было возможным их использование в многопоточной среде.
- Добавлен Makefile для компиляции в MSVC++ 5.0.

К сожалению, из-за недостатка свободного времени у разработчика в 4.0 реализовано не все, что планировалось, поэтому первые три подверсии (4.0-4.2) будут отведены под следующие цели:

- Поддержка украинского и белорусского языков (4.0.1).
- Создание fluids.dll или fluids.so с описанием API для поиска (4.0.2).
- Поиск с учетом времени последней модификации проиндексированных документов (4.1.x, потребует изменения формата индексного файла).
- Совершенствование механизма индексации (4.2.x). Сейчас этот механизм полностью заимствован из 3.x.

Версия 4.0a8 в исходных текстах доступна с Web сервера SbNet по адресу http://www.sbnet.ru/soft/fluids/dist/ В ней пока отсутствует документация и исполняемые модули. Альфа версии присущи и другие недостатки, но на то она и alpha :). Выпуск betta версии планируется на конец февраля. В связи с допущеной мной идеологической ошибкой формат индексного файла в ней будет изменен (и его размер для того же объема индексируемой информации должен возрасти...)

| Версия 3.11.4 |

Это заключительная версия серии 3.x, главным образом фиксирующая обнаруженные ошибки в программном коде. Помимо этих исправлений в конфигурационный файл CGI модуля в раздел [main] введена дополнительная директива BodyTagAddition для задания дополнительных аттрибутов в теге <BODY> генерируемых страниц.

| Версия 3.11.3 |

В этой версии:

- В профильные файлы добавлены новые переменные и введены операторы, главным образом для того, чтобы была возможность самостоятельной реализации переменной OTHER_RESULT_PAGES.
- Создана новая служебная программа fldump для распечатки информации, содержащейся в индексном файле.
- К параметрам CGI модуля добавлен новый, с именем word, для определения кодировки клиента, когда идет обращение к поисковой системе со статичной страницы.
- Исправлены найденные ошибки.

| Версия 3.11.2 |

В этой версии продолжено совершенствование профильных файлов, в результате:

- введены переменные, которые могут быть использованы в любом профильном файле;

- добавлены новые переменные профильных файлов:

  Имя переменной | Значение переменной | Профильный файл
  $WHAT_ACTION | означает вид генерируемой в данный момент страницы: бланка запроса или результатов поиска; | любой
  $USED_INDEXES | список используемых индексов в виде ind=id1&ind=id2&...ind=idN, т.е. пригодном для организации ссылок | любой
  $STRUCTURE | область применимости запроса | любой
  $QUERY_TYPE | вид запроса | любой
  $RESULT_PAGE_HEADER | заголовок страницы с результатами поиска | стартовый и завершающий
  $SHORT_LAST_MODIFIED | дата внесения последних изменений в найденный документ в укороченном формате | результативный
  $SCORE | соответствие найденного документа запросу, выраженное в процентах (с долями процента) | результативный
  $SCORE_PROCENT | соответствие найденного документа запросу, выраженное в процентах (без долей процента) | результативный

- подключаемые файлы CGI модуля TopContentFile, BottomContentFile, FormHeaderFile, FormFooterFile, SearchHeaderFile и SearchFooterFile получают статус профильных;

    Внимание! Если Вы используете эти файлы, то необходимо:
- перенести их определения в конфигурационном файле CGI модуля из блока main в блок templates;
- встречающиеся в них символы '`$`' и '`\`' (символы доллара и обратного слэша) заэкранировать (т.е. предварить дополнительным символом '`\`');
- ограничить их размер 4-мя килобайтами.

- созданы примеры использования всего набора профильных файлов для представления бланка запроса и результатов поиска в стиле поисковых систем Aport и Следопыт и в свободном стиле #1.

Помимо этого:

- появилась возможность для исполняемых в режиме командной строки модулей FLUIdS выдавать сообщения в желаемой кодировке (ее можно указать с помощью опции -p);
- для версий под OS/2 и Windows 95/NT кодировка выдаваемых сообщений для исполняемых в режиме командной строки модулей FLUIdS установлена в ibm866 вне зависимости от рабочей кодировки;
- для версии под OS/2 исправлена эмуляция opendir()/readdir()/closedir();
- для случая, когда CGI модуль настроен на самостоятельную перекодировку, вывод русских букв в ссылках осуществляется в escape-виде (т.е. через %xx).

| Версия 3.11.1 |

В этой версии:

- введена поддержка профильного файла бланка запроса CGI модуля - с этого момента любой элемент сгенерированных CGI модулем страниц может быть задан самостоятельно;
- добавлены параметрические переменные $env и $color для всех видов профильных файлов;
- к переменным результативного профильного файла добавилась переменная URL_TEXT для правильного вывода адреса найденной ссылки в текстовом виде (в простом $URL могут встречаться символы амперсанд, пробел и т.д. - они нуждаются в специализированном экранировании при выводе в гипертекстовой среде);
- при обращении к CGI модулю с запросом на поиск, если строка запроса пуста или вообще отсутствует в аргументах вызова, то вне зависимости от значения аргумента w генерируется страница с бланком запроса.

| Версия 3.11 |

Для CGI модуля введен ряд усовершенствований, позволяющих более тонко настроить его выход под нужды администраторов системы:

- В блок main конфигурационного файла CGI модуля добавлена директива Options для запрещения или разрешения вывода тех или иных элементов генерируемых страниц. Общий формат директивы:

  `Options = опция1 опция2 ...`

  Доступны следующие опции:

  noFluidsLogo
    Не выводить заголовка страницы с логотипом FLUIdS.

  noMetaCharsetTag
    Не выдавать тега META с именем текущей кодировки (такой тег выдается, только если поддерживается возможнось самостоятельной перекодировки CGI модулем сгенерированных страниц).

  noCharsetList
    Не выдавать автоматически создаваемого набора ссылок, соответствующего поддерживаемым кодировкам.

  noSearchTime
    Не выводить времени, затраченного на обслуживание пользовательского запроса (т.е. времени поиска).

  noExecutedQuery
    Не выдавать пользовательского запроса в том виде, в котором он был воспринят поисковой системой.

  noFormHypertextAreas
    В бланке запроса не выдавать полей ввода, касающихся области поиска в гипертекстовых документах.

  noFormSpecialEffects
    В бланке запроса не использовать спецэффектов (для браузера IE версий 4 и старше).

  noLogoSpecialEffects
    В заголовке страницы с логотипом FLUIdS не использовать спецэффекты (для браузеров IE и NN четвертых версий и старше).

    Для разрешения опции необходимо из ее имени удалить префикс no. Но разрешать опции несколько бессмысленно, так как по умолчанию все они разрешены.

- Введена поддержка профильных файлов. Теперь можно менять форму представления результатов поиска.

    При выводе значений переменных профильных файлов директива Options не учитывается.

- Вместо директив HeaderFile и FooterFile введены 6 новых директив:

  TopContentFile и BottomContentFile
    Содержимое этих файлов как бы обрамляет текст сгенерированных страниц: TopContentFile следует сразу за тегом <body>, а BottomContentFile выдается непосредственно перед </body>. Эти два файла одинаковы для страницы с бланком запроса и страницы результатов.

  FormHeaderFile и FormFooterFile
    Заголовочный и "подножный" файлы для страницы с бланком запроса (аналоги HeaderFile и FooterFile, но применяемые только для страницы с бланком запроса).
    Для больней ясности ниже представлена обобщенная схема этой страницы:
      1. Текст файла TopContentFile;
      2. Заголовок страницы с логотипом FLUIdS;
      3. Автоматически созданный набор ссылок, соответствующего поддерживаемым кодировкам;
      4. Текст файла FormHeaderFile;
      5. Бланк запроса;
      6. Текст файла QueryHelpFile;
      7. Текст файла FormFooterFile;
      8. Текст файла BottomContentFile.
    Эдесь тот или иной элемент может отсутствовать, если он не определен в конфигурационном файле или запрещен в нем (или на момент компиляции).

  SearchHeaderFile и SearchFooterFile
    Заголовочный и "подножный" файлы для страницы с результатами поиска (аналоги HeaderFile и FooterFile, но применяемые только для страницы результатов).
    Для этой страницы аналогичная схема выглядит так:
      1. Текст файла TopContentFile;
      2. Заголовок страницы с логотипом FLUIdS;
      3. Текст файла SearchHeaderFile;
      4. Информация о запросе (или текст файла ModelBeginFile);
      5. Список результатов запроса;
      6. Набор ссылок на другие страницы результатов (или текст файла ModelEndFile);
      7. Бланк запроса;
      8. Текст файла QueryHelpFile;
      9. Текст файла SearchFooterFile;
      10. Текст файла BottomContentFile.

Помимо этого:

- поисковая система спортирована под OS/2;
- проверена правильность выдаваемых англоязычных сообщений;
- к определенному в HTTP запросе имени конфигурационного файла теперь добавляется постфикс ".cfg", т.е. при обращении к CGI модулю вида fluids.cgi?cfg=myconf&... имя myconf будет преобразовано в myconf.cfg;
- исправлены найденные ошибки.

| Версия 3.10.4 |

В этой версии:

- В конфигурационный файл CGI модуля добавлен блок user-agent. В качестве директив в нем выступают названия кодировок, в качестве их значений - шаблоны, которые будут сравниваться с идентификационной строкой, посылаемой браузером пользователя в HTTP запросе. С помощью директив этого конфигурационного блока CGI модуль сможет определить кодировку клиента, если она не указана в параметрах вызова fluids.cgi (через параметр cs) или не определяется из устанавливаемой Web сервером Russian Apache переменной окружения CHARSET (это имя задается параметром компиляции HTTPD_CHARSET_ENVIRONMENT).
- JavaScript код, генерируемый CGI модулем для браузера Netscape Navigator, теперь выдается перед теми тегами HTML, в которых он используется.

| Версия 3.10.3 |

Почти все внесенные изменения в этой версии касаются CGI модуля:

- Оказалось, что ключевые слова в пользовательских запросах не переводились в нижний регистр. В результате получалось, что ключевому слову, в котором находилась хотя бы одна заглавная буква, не отвечало ни одного проиндексированного документа. Эта ошибка присутствует во всех предыдущих версиях серии 3.x, поэтому всем владельцам поисковой системы FLUIdS настоятельно рекомендуется обновить ее до текущей версии 3.10.3.
- В конфигурационный файл CGI модуля в блок index, описывающий используемый индекс, добавлены директивы allow и disallow для определения имен станций Интернет или их IP адресов, с которых разрешен или наоборот, запрещен, доступ к данному индексу. По умолчанию, когда ни одна из этих директив не используется, индекс считается общедоступным.
- Бланк запроса, генерируемый CGI модулем, сделан более адекватным возможностям поисковой системы системы.
- Код JavaScript вынесен из "головы" генерируемых страниц в "тело" - теперь в случае возникновения какой-либо нештатной ситуации (например, отсутствия индексов для поиска) браузер не будет жаловаться, что какие-то объекты или методы JavaScript ему не доступны.
- Исправлены найденные ошибки.

| Версия 3.10.2 |

Как показала практика, специальное обслуживание стоп-слов в локальных индексах и отбрасывание коротких слов при индексации не имеют под собой реальной почвы (размер индексного файла сокращается незначительно, менее чем на 10%, а неудобства создаются большие - никогда не знаешь заранее, отброшено данное ключевое слово при индексации или же просто отсутствует в индексируемых текстах). Поэтому было решено назначить начальные установки в исходных текстах FLUIdS таким образом, чтобы индексировались ВСЕ слова, и, соотвественно, чтобы был возможен поиск по ЛЮБЫМ разумным ключевым словам.

В соответствии с новой стратегией начальные установки были переопределены следующим образом:

- MIN_WORD_LENGTH установлен в 1 (данное значение можно изменить в конфигурационном файле индексации директивой MinWordLength);
- IGNORE_PERCENT_LIMIT определен как 101 (изменяется директивой IgnorePercentLimit);
- запрещены практически все правила отбора для индексируемых слов (кроме требования принадлежности слова либо русскому, либо анлийскому языку);
- в примерном конфигурационном файле индексации (файл ./examples/indexing/index.cfg) закоментированы директивы CommonWords и ValidWords.

Помимо этого, если в запросе в качестве ключевого слова встретилось стоп-слово, то теперь оно игнорируется. Причина такому решению - нулевой результат поиска, если стоп-слово связывалось с остальными ключевыми словами операцией AND.

Дополнительно в конфигурационный файл индексации введены две новые директивы: MinWordLength и MaxWordLength, являющиеся аналогами параметров компиляции MIN_WORD_LENGTH и MAX_WORD_LENGTH.

Другие внесенные изменения:

- Добавлена новая утилита smpgrep, позволяющая осуществлять простой поиск последовательности символов в строках текстовых файлов.
- К принятому по умолчанию списку ValidWords добавлено слово vm.
- Поправлена автоконфигурация для функции qsort.
- Исправлены найденные ошибки.

| Версия 3.10.1 |

В конфигурационный файл индексации добавлены три новые директивы:

- MaxMemoryVolum - задает ограничение на размер индекса слов, хранимый программой flindex в оперативной памяти. Ранее эта величина определялась только параметром компиляции MAX_MEMORY_VOLUM. От значения этой величины сильно зависит производительность процесса индексации, и для оптимального времени индексации больших объемов информации ее приходится подбирать (обычный диапазон приемлемых значений - от 1/5 до 1/2 от общего объема оперативной памяти, установленной в компьютере и измеряемой в байтах). Ранее при изменении этой величины необходимо было перекомпилировать исходные тексты FLUIdS, теперь же с директивой MaxMemoryVolum необходимость в этом отпала.
- TempDir - задает имя директории для хранения временных файлов. В предыдущих версиях эта директория была жестко задана в библиотеках C (для UNIX систем это обычно /tmp, для MS Windows - текущая директория). Вполне реальна ситуация, когда раздел диска, в котором находится эта директория, переполняется (тогда выдается сообщение вида "File system is full"). Ранее поделать с этим ничего было нельзя. Теперь же с помощью директивы TempDir можно переопределить директорию для временных файлов так, чтобы она указывала на раздел диска с достаточным объемом свободного дискового пространства.
- RejectWords - определяет набор шаблонов для неиндексируемых слов. Эта директива служит некоторой альтернативой для правил отбора индексируемых слов, задаваемых в момент компиляции системы соответствующими параметрами компиляции. Директива RejectWords - достаточно мощное средство фильтрации индексируемых слов.

Помимо этого, директивы IgnoreFilesLimit и IgnorePercentLimit перенесены из конфигурационного блока main в блок words.

В этой версии значительно расширен список стоп-слов, принятый по умолчанию. Теперь он имеет следующий вид:

  Английские слова:
    a, all, an, and, are, can, could, did, do, for, from, had, have, it, may, not, of, that, the, this, was, will, with, you, your;

  Русские слова:
    в, на, не, но, при, по.

Обновился и список ValidWords:

  Английские слова:
    95, 98, ar, bg, c, cc, cd, cp, dd, ed, h1, h2, h3, h4, h5, h6, fg, id, im, ip, ln, ls, mc, mv, nc, ng, nt, od, os, pr, re, rm, sh, tr, vi, wc;

  Русские слова:
    ад, ом, си, уж, ус, юг, яд, яndex.

Внесены следующие исправления:

- По окончании процесса индексации в индексном файле теперь сохраняются только те заданные директивой CommonWords стоп-слова, которые реально встретились в текстах индексируемых файлов (ранее сохранялся весь список).
- Для кодировки koi8-r, в которой русские буквы расположены в таблице символов не в алфавитном порядке, исправлено сравнение скобочных метасимволов вида [б-г] в шаблонах с русскими буквами.
- По недоразумению присутствовало ограничение на число генераций имен временных файлов (могло быть сгенерировано только 1000 имен). Подобное ограничение могло привести к тому, что прилагаемая к FLUIdS утилита при обработке файлового дерева на тысячном файле прекратила бы свое выполнение с ошибкой "cann't generate name for the temporary file". Сейчас подобное ограничение снято.

| Версия 3.10 |

В этой версии очередной (и, наверное, последний в серии 3.x) раз поменялся формат индексного файла. Это сделано по нескольким соображениям, но главное из них - это возможность совместного использования индексных файлов, созданных на одной платформе, но в разных операционных средах (в частности, в UNIX и MS Windows для платформы Intel). Оказалось, что кроме различных кодировок создаваемых индексов, существовало разночтение заголовка индексных файлов. В новой версии, таким образом, вводится 'полууниверсальный' формат индексных файлов (это шаг в сторону версии 4.0) плюс возможность поиска по индексам, находящимся в разных кодировках. Однако объединение двух разнокодировочных индексов (это делает программа flmerge) пока не возможно.

В новой версии необходимо корректно определить рабочую кодировку FLUIdS, задаваемую параметром компиляции FLUIDS_LOCAL_CHARSET, а также соответствующий его значению APPLY_CYR_* (файл ./src/cfgrus.h). Если же последний не задан, то исполняемые модули FLUIdS выдадут ошибку: "Неизвестная кодировка xxx", где xxx - значение вышеупомянутого параметра компиляции FLUIDS_LOCAL_CHARSET. Все это не важно, если отключена поддержка русского языка.

Помимо этого в версии 3.10 переименованы некоторые параметры вызова (или их значения) CGI модуля (с целью уменьшения числа символов в их именах):

Старое имя/значение | Новое имя/значение
--- | ---
what | w
form | frm
search | sch
conf | cfg
qform | qf
eform | ef
iform | if
terse | trs
charset | cs
query | q

В числе других изменений:

- Обновлены библиотеки libz и libcgi. Теперь любое имя функции, глобальной переменной или структуры в библиотеке libz начинается с символа 'z', а в libcgi - с символов 'cgi' или 's'. Также в эти библиотеки перенесены некоторые функции из непосредственного кода FLUIdS.
- В libz добавлены функции определения отрезков времени (с точностью до миллисекунд). Теперь поисковые модули сообщают затраченное на поиск время (обычно это доли секунды).
- Программа flsearch сообщает дополнительно кодировку индексного файла и число найденных в нем результатов поиска.
- Убран за ненадобностью параметр компиляции SMALL_INDEX.
- К принятому по умолчанию списку ValidWords добавлены слова "ад", "ом", "си", "уж", "ус", "юг" и "яд" (если включена поддержка русского языка).
- Чтобы скомпилировать все прилагаемые к FLUIdS утилиты, теперь необходимо выполнить команду 'make utils'. Ранее отвечавшая за это команда 'make convertors' создает только программы-перекодировщики (xxx2yyy).
- Устранены найденные ошибки.

| Версия 3.9.2 |

Главное отличие этой версии от предыдущей - возможность компиляции и эксплуатации системы FLUIdS в среде MS Windows 95/NT. Для этого в дистрибутивную поставку FLUIdS добавлен соответствующий make-файл, разработанный для компилятора Borland C 5.02 (сейчас рассматривается возможность адаптации make-файла под Visual C++ 5.0), и внесены дополнительные изменения в исходный код системы, а именно:

- Учтены особенности файловых систем, используемых в MS Windows (VFAT или NTFS):
  - символом-разделителем имен поддиректорий служит обратный слэш, а не прямой;
  - имена файлов не зависят от регистра составляющих их букв;
  - полное имя файла может быть записано в виде c:file.ext, без разделяющего драйв и имя файла слэша.
- Если для CGI модуля не определена переменная окружения SCRIPT_FILENAME, то она определяется из аргументов вызова fluids.exe.

Для желающих использовать FLUIdS в среде MS Windows 95/NT специально создан отдельный дистрибутив fluids-cur.zip (упакован с помощью pkzip), в котором все файлы находятся в кодировке windows-1251, а начальные установки определяют рабочую кодировку FLUIdS как "win".

Помимо этого, в FLUIdS введена новая утилита repl, помогающая при процедуре перекодировки исходных текстов, в результате чего эта процедура значительно упростилась.

Из других изменений можно отметить следующие:

- К принятому по умолчанию списку ValidWords добавлено слово cd;
- Немного подправлена автоконфигурация (теперь проверяются на существование и корректность функции memcmp и bcmp, а также тестируется файловая система на предмет регистро-зависимых имен файлов);
- При процедуре перекодировки исходных текстов перекодируются также документация и примеры.

| Версия 3.9.1 |

Новое в этой версии:

- Появилась возможность автоматической перекодировки исходных текстов FLUIdS, если используемая в системе кодировка отличается от начальной кодировки текстов FLUIdS koi8-r.
- Теперь можно индексировать документы, находящиеся в различных кодировках.
- Исправлена неприятная ошибка в CGI модуле, связанная с тем, что для результатов поиска заранее выделялась память исходя из значения параметра start. Поэтому злонамеренный пользователь мог повысить загрузку Web сервера, посылая ему запросы вида fluids.cgi?q=a*&start=10000000, если на стороне Web сервера не стояло ограничения на выделяемый объем памяти для CGI модулей.
- Подкорректирован verbose output программы flindex.

На главную страницу | valera@sbnet.ru