使用 nhibernate.search 时重新索引 lucene.net 索引的最简单方法?

发布于 2024-08-21 13:12:17 字数 335 浏览 6 评论 0原文

上下文=>
调用wcf,一些随机存储过程和sql东西理论上会导入一些数据。

要求=>
为一些导入的实体重新索引 lucene 索引。

问题 =>
最简单的方法是什么?

理论上,如果 nhibernate 被初始化,nhibernate.search 应该知道哪些实体应该被索引。因此 - 我想知道,有没有现成的工具/什么来满足我的要求?


这是唯一的方法吗?

Context =>
Calling wcf, some random stored procedures and sql stuff theoretically imports some data.

Requirements =>
Reindex lucene indexes for some of imported entities.

Question =>
What's the easiest way to do that?

Theoretically, if nhibernate is initialized, nhibernate.search should be aware which entities are supposed to be indexed. Therefore - i was wondering, are there any ready to use tools/whatnot to fulfill my requirement?


Is this the only way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

jJeQQOZ5 2024-08-28 13:12:17

我的快速而肮脏的方法=>

 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

My quick and dirty approach =>

 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);
        }
    }

No ideas about transaction and paging part (and don't care at the moment). Kind a does what i needed. :D

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文