Как определить рейтинг для результатов поиска NHibernate, основываясь на расположении поискового запроса в результатах? - PullRequest
1 голос
/ 14 апреля 2011

У меня есть постраничный список результатов поиска.Пользователь может искать 'сумасшедший', и все, что с этой последовательностью символов в любом месте имени возвращается.

Меня попросили изменить это так, чтобы этот набор результатов был ранжирован по релевантности.Поэтому, если обычно список будет возвращен как

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

, имея в виду, что этот список должен быть разбит на страницы (т.е. я могу 't просто взять результат поиска и вручную удалить вхождения «сумасшедший» из середины и переместить их вперед), есть ли способ с NHibernate, который я могу указать требуемое ранжирование?

Или я долженвыполнить 2 запроса: сначала поиск всего, что начинается с «derp», а второй, который содержит «derp», но не начинается с него?

1 Ответ

4 голосов
/ 14 апреля 2011

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)
...