Самый простой способ переиндексировать индексы lucene.net при использовании nhibernate.search? - PullRequest
1 голос
/ 15 февраля 2010

Context =>
Вызов wcf, некоторых случайных хранимых процедур и SQL-вещей теоретически импортирует некоторые данные.

Требования =>
Переиндексировать люценовые индексы для некоторых импортируемых объектов.

Вопрос =>
Какой самый простой способ сделать это?

Теоретически, если nhibernate инициализирован, nhibernate.search должен знать, какие объекты должны быть проиндексированы. Поэтому - мне было интересно, есть ли какие-нибудь готовые инструменты / что еще, чтобы выполнить мое требование?


Является ли этот единственный путь?

1 Ответ

3 голосов
/ 17 февраля 2010

Мой быстрый и грязный подход =>

 public static class LuceneReindexer
    {
        public static void Run()
        {    
            var entityTypes = typeof(FooEntity).Assembly.GetTypes()
                .Where(x => x.BaseType == typeof(Entity)
                    || x.BaseType == typeof(KeyedEntity));

            foreach (var t in entityTypes)
                if (TypeDescriptor
                   .GetAttributes(t)[typeof(IndexedAttribute)] != null)
                      ReindexEntity(t);
        }

        private static void ReindexEntity(Type t)
        {
            var stop = false;
            var index = 0;
            const int pageSize = 500;

            do
            {
                var list = NHibernateSession.Current.CreateCriteria(t)
                    .SetFirstResult(index)
                    .SetMaxResults(pageSize).List();

                NHibernateSession.Current.Transaction.Begin();
                foreach (var itm in list)
                    NHibernateSession.Current.Index(itm);
                NHibernateSession.Current.Transaction.Commit();

                index += pageSize;
                if (list.Count < pageSize) stop = true;
            } while (!stop);
        }
    }

Нет идей о транзакции и пейджинговой части (и на данный момент все равно). Вид делает то, что мне нужно. : D

...