【问题标题】:How to specify a ranking for NHibernate search results, based on location of search term in results?如何根据搜索词在结果中的位置指定 NHibernate 搜索结果的排名?
【发布时间】:2011-04-14 18:57:52
【问题描述】:

我有一个搜索结果的分页列表。用户可以搜索“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”但不以它开头的内容?

【问题讨论】:

    标签: c# nhibernate search ranking


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      相关资源
      最近更新 更多