周末在家看了看Lucene.Net。想尝试着给数据库加上全文检索的功能。
早就听说Lucene的API很复杂难用,看了几篇文档之后有了打退堂鼓的念头。。。已经不单单是API的问题了,就那个检索的语法就。。。
于是很自然的想到了有没有Linq to Lucene,搜索了一下,果然找到了codeplex上的一个项目。不过看起来主要是为了解决语法问题的,生成index的工作貌似还是要自己去做,至少我看这个例子中是这样的。
貌似也提供接口直接对整个数据库索引,接受DataContext参数,不过这样貌似比较适合真正的大型应用,每天访问量最低的时候做一次,而我想做的是实验性的,实时index的。而且还有一个问题就是貌似这个Linq to Lucene主要是针对Linq To SQL的(所以才有DataContex),论坛里也有使用Entity Framework的例子,不过我对两者都不怎么熟悉。。。
这里顺便抱怨一句,之所以使用Linq To SQL少就是因为它的DataContex的生命周期管理比较复杂,网上也有很多相关的讨论。对比我比较熟悉的Nhibernate来说,感觉上new一个DataContex比Get一个Session开销是要大很多的,因为DataContex应该也做了NH中SessionFactory的一些操作。当然这只是我的主观臆测,求指正。
回到正题,搜索的过程中,发现了NH也提供了一个NHibernate.Search项目,提供了集成Lucene。关于这个项目,资料还是比较多的,比如园子里的这里和这里。可以通过NH的Interceptor实时的更新index,正是我想要的东西,开工~~~
首先是如何或得到NHibernate.Search.dll,这个东西没有正式release过。上面提及的两个例子中都给出项目下载, 其中包括了这个dll,也可以到项目的svn上下载最新代码,不过我编译失败了T T。最终我在这里下载到了对应NH2.1的dll。
代码就不贴了,只是照着老莫的例子在我的数据库结构上试了一下。谈一下几个小的感想吧。
一是还不知道怎么取出相关度来,只是看到可以按照相关度排序(Sort类提供的RELEVANCE对象),相比而言,前面提及的Linq to Lucene中通过实现IHit就能得到相关度还是很贴心的。有经验的请指教吧。
二是混合一些字段的全文检索和另一些字段的普通数据库检索,大概是通过在IFullTextQuery上调用SetCriteriaQuery实现的,但是我不会写Criteria啊~~杯具。。。哪天找时间看看LinqToNH是怎么把表达式翻译成Criteria的吧(不过真没有动力,反正NH3里就不用了)
最后,FullTextQuery没有实现Future方法啊?呵呵。