全文检索–查询数据
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();
}
}