#c# #sql-server #lucene #lucene.net
Вопрос:
Я новичок на Люсене.Net и в настоящее время проводит исследования и разработки, чтобы использовать это для .Сетевые приложения. Как Люсена.Net-это библиотека общего назначения, и она не имеет ничего общего с источниками данных, такими как SQL Server, SQLite и т.д. Он знает только, что у вас есть документ Lucene, который вы хотите проиндексировать. Поэтому, когда мы сбрасываем данные в Lucene.Нетто из любого источника данных. Как мы можем сделать Люсена.Сетевые документы обновляются по мере того, как данные находятся в базе данных SQL(например). Один из способов хранения обоих данных, т. е. (Lucene.Net и SQL) синхронизация заключается в постоянном обновлении индекса Lucene во время каждого обновления базы данных. Мы также знаем, что существует вероятность того, что кто-то может вручную внести изменения в базу данных SQL, в этом случае как мы можем обновить индексы Lucene?
Ответ №1:
Я могу дать концептуальный обзор того, как это сделать. По сути, вам нужны три вещи.
- Способ узнать каждый раз, когда часть соответствующих данных в базе данных sql изменяется
- Место для сбора информации об этом изменении, назовите его журналом изменений.
- Процедура, которая считывает журнал изменений, применяет эти изменения к индексу 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, представляющие индекс, сгруппированы в файл операционной системы)