如何根据结果中搜索词的位置指定NHibernate搜索结果的排名?

时间:2011-04-14 10:19:40

标签: c# nhibernate search ranking

我有一个分页搜索结果列表。用户可以搜索“derp”,并返回名称中任何位置的任何字符序列。

我被要求更改此设置,以便最初按相关性对这组结果进行排名。因此,如果通常列表将作为

返回
a derp abc // everything is alphabetical
a derp xyz
b derp abc
derp abc
derp def
herp derp a
herp derp b

现在列表需要按

排序
derp abc // these guys are given prominence
derp def
a derp abc // the rest of results alphabetical as normal
a derp xyz
b derp abc
herp derp a
herp derp b

请记住,这个列表必须被分页(即我不能只是从搜索结果中取出并从中间手动删除'derp'并将它们移到前面),NHibernate有什么方法可以我可以指定所需的排名吗?

或者我是否必须进行2次查询,首先搜索以“derp”开头的任何内容以及第二次包含“derp”但不是以“derp”开头的内容?

1 个答案:

答案 0 :(得分:4)

OrderBy可以使用Projections,所以这样可以正常工作:

var list = session.QueryOver<Store>()
    .Where(s => s.Name.IsLike("My", MatchMode.Anywhere))
    .OrderBy(NHibernate.Criterion.Projections.Conditional(
        NHibernate.Criterion.Restrictions.Like(
            NHibernate.Criterion.Projections.Property<Store>(s => s.Name), "My",
                MatchMode.Start),
            NHibernate.Criterion.Projections.Constant(0),
            NHibernate.Criterion.Projections.Constant(1))).Asc
    .ThenBy(s => s.Name).Asc
    .List();

我们在这里做的是使用一个基本上转换为以下SQL的Projection:

ORDER BY (case when this_.Name like 'My%' then 0 else 1 end)