Люсинен.Обновление чистого индекса при изменении базы данных SQL вручную

#c# #sql-server #lucene #lucene.net

Вопрос:

Я новичок на Люсене.Net и в настоящее время проводит исследования и разработки, чтобы использовать это для .Сетевые приложения. Как Люсена.Net-это библиотека общего назначения, и она не имеет ничего общего с источниками данных, такими как SQL Server, SQLite и т.д. Он знает только, что у вас есть документ Lucene, который вы хотите проиндексировать. Поэтому, когда мы сбрасываем данные в Lucene.Нетто из любого источника данных. Как мы можем сделать Люсена.Сетевые документы обновляются по мере того, как данные находятся в базе данных SQL(например). Один из способов хранения обоих данных, т. е. (Lucene.Net и SQL) синхронизация заключается в постоянном обновлении индекса Lucene во время каждого обновления базы данных. Мы также знаем, что существует вероятность того, что кто-то может вручную внести изменения в базу данных SQL, в этом случае как мы можем обновить индексы Lucene?

Ответ №1:

Я могу дать концептуальный обзор того, как это сделать. По сути, вам нужны три вещи.

  1. Способ узнать каждый раз, когда часть соответствующих данных в базе данных sql изменяется
  2. Место для сбора информации об этом изменении, назовите его журналом изменений.
  3. Процедура, которая считывает журнал изменений, применяет эти изменения к индексу LuceneNet и помечает обработанную запись в журнале изменений.

Конечно, существует множество различных способов справиться с каждым из них.

1) Знание Того, Какие Данные Изменились

Самый простой способ справиться с #1 — это если ваша база данных поддерживает триггеры вставки, обновления и удаления. Если это так, то вы можете добавить эти три триггера в каждую таблицу, которая предоставляет данные в индекс LuceneNet, и когда запись в одной из этих таблиц изменяется, триггер может автоматически записывать запись в журнал изменений, в котором указываются таблица, идентификатор записи и операция (вставка, обновление, удаление). Если ваша база данных не поддерживает триггеры, то это немного сложнее. Вы можете подключиться к какому-нибудь общему api, который ваше приложение использует для связи с базой данных при вставке, обновлении и удалении, и этот крюк запишет ту же информацию в журнал изменений.

2) Журнал Изменений

Журнал изменений может принимать множество форм, но самый простой способ, вероятно, — это просто создать таблицу в базе данных sql. Таким образом, триггеры вставки, обновления и удаления могут записывать свои наблюдения напрямую, вставляя запись в таблицу списка изменений. Его проявление в виде таблицы базы данных sql также работает, если вы пишете в нее из оболочки api.

3) Применение изменений к LuceneNet

Существует множество способов реализовать это, но, вероятно, наиболее надежным является использование таймера для запуска фонового потока, который проверяет наличие необработанных записей журнала изменений каждые столько-то секунд. Если он находит такие записи, он считывает их, проверяет, выполняется ли операция вставки, обновления или удаления и для какой таблицы и идентификатора записи. Если вставить или обновить, он считывает записи из базы данных sql и вставляет или обновляет запись в LuceneNet. Если для удаленного, он напрямую удаляет запись в LuceneNet. Затем он устанавливает логическое значение в записи журнала изменений, чтобы указать, что запись была обработана.

Есть еще много наворотов, которые можно добавить, но это должно дать вам довольно четкое представление о том, как реализовать способ обновления индекса LuceneNet почти в реальном времени.

Комментарии:

1. Спасибо @RonC. Не могли бы вы, пожалуйста, сказать мне еще одну вещь, т. е. сколько документов может быть в Lucene. Сеть может быть в одном каталоге?

2. Документы или индексы? Документы Lucene не помещаются непосредственно в каталог, они помещаются в индекс Lucene.

3. Да, я имею в виду Индексы. Меня интересует количество/количество индексов в каталоге.

4. Как такового предела нет. Вы будете ограничены только операционной системой. И первое ограничение ОС, которого вы, скорее всего, достигнете, — это максимальное количество открытых дескрипторов файлов. (Именно поэтому в Lucene есть возможность использовать составные индексные файлы, в которых многие файлы lucene, представляющие индекс, сгруппированы в файл операционной системы)