Плагин fts_lucene_plugin
Плагин fts_lucene_plugin предназначен для поддержания полнотекстовых индексов, созданных с помощью библиотеки IBSurgeon Full Text Search UDR https://github.com/IBSurgeon/lucene_udr, в актуальном состоянии.
Важно: плагин fts_lucene_plugin не может поддерживать индексы в качестве ключа которого выбран псевдо-столбец RDB$DB_KEY, поскольку значения этого
псевдо-столбца не попадают в лог репликации. Кроме того, не будут автоматически обновляться полнотекстовые индексы построенные для представлений.
Алгоритм работы плагина fts_lucene_plugin
- служба
fb_streamingанализирует директорию с журналами репликации, установленную для задачи, на наличие необработанных файлов; - на каждой итерации перечитываются метаданные полнотекстовых индексов;
- выбираются только полнотекстовые индексы в активном состоянии;
- создаётся список таблиц, для которых созданы эти индексы, в дальнейшем этот список используется для фильтрации событий (INSERT, UPDATE, DELETE);
- для ещё необработанных файлов репликации анализируются следующие события:
- старт транзакции (выделяется структура в памяти для хранения точек сохранения);
- создание точки сохранения (выделяется структура в памяти для хранения документов полнотекстовых индексов);
- освобождение точки сохранения (документы сохранённые в этой точки сохранения копируются в точку сохранения более высокого уровня);
- откат точки сохранения (точка сохранения уничтожается вместе со всеми документами);
- фиксация транзакции (применяются изменения для всех затронутых полнотекстовых индексов: новые документы добавляются в соответствующий индекс, изменившиеся обновляются, а удалённые удаляются);
- откат транзакции;
- вставка новой записи (только для таблиц которые участвуют в полнотекстовых индексах). Для каждого индекса создаётся новый документ и сохраняется в список добавленных документов для точки сохранения.
- обновление записи (только для таблиц которые участвуют в полнотекстовых индексах). Для каждого индекса создаётся новый документ. Новый документ и ключ для поиска сохраняются в список документов для обновления для точки сохранения.
- удаление записи (только для таблиц которые участвуют в полнотекстовых индексах). В текущую точку сохранение сохраняется значение ключа для поиска и удаления соответствующего документа.
Остальные события репликации игнорируются.
Особенности работы:
- если в созданном документе все индексируемые поля пусты, документ не будет добавлен в индекс;
- если не изменилось ни одного индексируемого поля в документе, то такой документ не будет обновлён в индексе;
- если в обновлённом документе все индексируемые поля пусты, то такой документ будет удалён.
Настройка плагина fts_lucene_plugin
Для примера будем использовать базу данных fts_demo_4.0
Прежде всего, необходимо установить для этой базы данных библиотеку IBSurgeon Full Text Search UDR и создать нужные нам полнотекстовые индексы. Этот процесс описан в https://github.com/IBSurgeon/lucene_udr
Теперь настроим асинхронную репликацию для этой базы данных, для этого в файле replication.conf необходимо добавить следующие строчки:
database = d:\fbdata\4.0\fts_demo.fdb
{
journal_directory = d:\fbdata\4.0\replication\fts_demo\journal
journal_archive_directory = d:\fbdata\4.0\replication\fts_demo\archive
journal_archive_command = "copy $(pathname) $(archivepathname) && copy $(pathname) d:\fbdata\4.0\replication\fts_demo\archive_fts
}
Обратите внимание: здесь происходит дублирование файлов архивов журналов, чтобы одновременно работала логическая репликация и задача по обновлению полнотекстовых индексов. Это необходимо, поскольку файлы с архивами журналов удаляются после обработки и не могут быть использованы другой задаче.
Теперь необходимо включить репликацию в базе данных:
ALTER DATABASE INCLUDE ALL TO PUBLICATION;
ALTER DATABASE ENABLE PUBLICATION;
Далее настроим конфигурацию fb_streaming.conf для того, чтобы fb_streaming автоматически обновлял полнотекстовые индексы.
task = d:\fbdata\4.0\replication\fts_demo\archive_fts
{
database = inet://localhost:3054/d:\fbdata\4.0\fts_demo.fdb
username = SYSDBA
password = masterkey
plugin = fts_lucene_plugin
}
Теперь можно установить и запустит службу:
c:\streaming>fb_streaming install
Success install service!
c:\streaming>fb_streaming start
Service start pending...
Service started successfully.
В Linux:
sudo systemctl enable fb_streaming
sudo systemctl start fb_streaming
Пока служба запущена все активные полнотекстовые индексы, за исключением индексов созданных на представлениях и индексов, где в качестве ключа выбран псевдо-столбец RDB$DB_KEY, будут автоматически обновляться при изменении данных в таблицах базы данных fts_demo.fdb.