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

本文关键字:NHibernate 搜索结果 位置 搜索 结果 何根 | 更新日期: 2023-09-27 17:50:15

我有一个搜索结果的页面列表。用户可以搜索'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',但不以它开始?

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

OrderBy可以使用投影,所以这将工作得很好:

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:

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