关闭

NHibernate使用入门(三)

标签: 全文检索数据
484人阅读 评论(0) 收藏 举报
分类:

全文检索–查询数据

NHibernate.config配置文件

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>

        <!--数据库连接。-->
        <property name="connection.connection_string">Data Source=.\SQLINSTANCE;Initial Catalog=NHibernateDemo;Persist Security Info=True;User ID=sa;Password=123456</property>

        <!--声明是哪一个数据库驱动程序。-->
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <!--所使用的SQL方言,通过这个方言,NHibernate才知道要将你写的查询语句,翻译成何种数据库的SQL语句。-->
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <!--代理工厂配置。用于指定是哪个中间件提供的延迟加载代理-->

        <property name="show_sql">true</property>

        <!--设定映射文件默认所在的程序集。-->
        <mapping assembly='Model' />

        <!--下面是NHibernate.Search的配置,我们采用基于文件目录的全文检索,索引文件放在根目录下面的Index文件夹下面.
        另外,我们设置一下NHibernate的事件监听(如果不我们设置的话,我们要手动去调用,才能够使NHibernate在持久化对象时,同时处理全文索引),现在这个事件配置还不支持直接在NHibernate这样配置:-->
        <listener type='post-insert' class='NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search' />
        <listener type='post-update' class='NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search' />
        <listener type='post-delete' class='NHibernate.Search.Event.FullTextIndexEventListener, NHibernate.Search' />

    </session-factory>
</hibernate-configuration>

 public class Program
    {
        public static void Main(string[] args)
        {
            NHibernateProfiler.Initialize();
            try
            {
                var configuration = new Configuration();
                configuration.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener());
                configuration.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener());
                configuration.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener());
                configuration.Configure("NHibernate.config")
                    //缓存路径
                    .SetProperty("hibernate.search.default.indexBase", @"./Indexes")
                    //全文检索缓存方式
                    .SetProperty("hibernate.search.default.directory_provider",
                        typeof (FSDirectoryProvider).AssemblyQualifiedName)
                    /*hibernate search底层使用Lucene,所以Lucene可以使用的中文分词,hibernate search都可以用来支持中文词法分析,
                   比较常用的词法分析器包括paoding,IKAnalyzer,mmseg4j 等等。
                   具体可以参考分词分析 最近分析。
                   hibernate search默认的分词器是org.apache.lucene.analysis.standard.StandardAnalyzer,
                   中文按字分词,显然不符合我们的需求。
                   这里介绍一下如何在hibernate中配置中文分词,选择的是Lucene自带的中文分词–。
                   使用可以通过3种方式,一种是在hibernate的配置文件设置词法分析方法,
                   另外一种是在每个需要被搜索的类中定义分词方法,
                   最后一种是对单个字段配置。这里介绍下前2种的配置方式。 */
                    .SetProperty("hibernate.search.analyzer", typeof (StandardAnalyzer).AssemblyQualifiedName);


                ISessionFactory factory = configuration.BuildSessionFactory();

                //using (var s = factory.OpenSession())
                //using (s.BeginTransaction())
                //{
                //    var user = new User
                //    {
                //        CreatedAt = DateTime.Now,
                //        Username = "wu",
                //        Email = "827937686@qq.com",
                //    };
                //    s.Save(user);
                //    var blog = new Blog
                //    {
                //        CreatedAt = DateTime.Now,
                //        Users = { user },
                //        Title = "分布式集群",
                //        Subtitle = "zookeeper使用入门"
                //    };

                //    s.Save(blog);

                //    var post = new Post
                //    {
                //        Blog = blog,
                //        Text = "哈哈批量处理的文本",
                //        Title = "NHibernate",
                //        PostedAt = DateTime.Now,
                //        User = user
                //    };
                //    s.Save(post);

                //    s.Transaction.Commit();
                //}

                //for (int i = 0; i < 3; i++)
                {
                    using (ISession s = factory.OpenSession())
                    {
                        IList<Post> posts = NHibernate.Search.Search.CreateFullTextSession(s)
                            .CreateFullTextQuery<Post>("Title:NHibernate User.Name:ayende")
                            .List<Post>();

                        IList<Post> LastTenposts = NHibernate.Search.Search.CreateFullTextSession(s)
                            .CreateFullTextQuery<Post>("Title:NHibernate User.Name:wu")
                            .SetMaxResults(10)
                            .List<Post>();

                        foreach (Post post in posts)
                        {
                            Console.WriteLine(post.Title);
                        }

                        foreach (Post post in LastTenposts)
                        {
                            Console.WriteLine(post.Title);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
            LogManager.Shutdown();
        }
    }

运行结果如图:

这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:892481次
    • 积分:12988
    • 等级:
    • 排名:第1104名
    • 原创:307篇
    • 转载:439篇
    • 译文:56篇
    • 评论:93条
    博客专栏
    文章分类
    打赏
    如果你觉得我的文章对您有用,请随意打赏。 微信 支付宝