如何使用Nhibernate进行全文搜索并获得结果排名?

时间:2011-06-23 18:16:20

标签: nhibernate full-text-search

我有一个SQL 2008 R2数据库,设置了全文索引,并希望使用NHibernate来获取排名搜索结果。我已经想出了用于获得结果排名的SQL查询以及FULLTEXTTABLE,但我正在努力使用NHibernate来获得排名值的结果,因为它没有映射到任何表中的实际列。

任何指针?

1 个答案:

答案 0 :(得分:1)

(首先,以下语法会有点模糊,因为这是来自内存,请检查api)

你可以构建一些DTO类并在运行中映射

例如:

public class Person
{
     public virtual String Name {get;set;}
     public virtual String Surname {get;set;}
}

正确映射到nhibernate 和

PersonDTO : Person
{
    public int FTSRanking {get;set;}
}

未映射。请注意,我继承自Person类,虽然这不是必需的,我只是为了方便而做。 此PersonDTO类仅用于查询,但存在限制,如以下hql所示。

NHSes.CreateQuery('select p.Name, p.Surname, p.FTSAlias as FTSRanking from Person p')
     .SetResultTransformer(Transformers.AliasToBean<PersonDTO>())

将返回一个由nhibernate设法组装的PersonDTO,因为选择列表中的每个项都与PersonDTO类中的属性(名称,大小写,类型)匹配。此外,您还必须手动键入选择列表,并且由于它不是映射类,因此nhibernate无法组合集合。

另一种选择是使用Criteria API来设置投影(也就是扩展选择列表)

IList<object[]> results = NHSes.CreateCriteria(typeof(Person))
         .Add(Expression.SQL(" your fts clause here "))
         .SetProjection(Projections.SQL(" add your fts ranking column here",,), Projections.( here add as a projection the main entity ))
         .List<object[]>();

在结果变量中,每个返回的行是一个对象[],第一个元素(即结果[0] [0])是排名,第二个元素(即结果[0] [1])是正确的托管Person对象