Эта страница переведена машинным переводом. Читайте английский оригинал. English

← Стриминг / CDC Firebird

Плагин 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.