Как выполнить полнотекстовый поиск с помощью Nhibernate и получить ранги результатов? - PullRequest
1 голос
/ 23 июня 2011

У меня есть база данных SQL 2008 R2 с настроенным полнотекстовым индексированием, и я хотел бы использовать NHibernate для получения результатов поиска с ранжированием.Я выяснил, что SQL-запросы используют FULLTEXTTABLE для получения ранжирования результатов, но я борюсь с тем, как использовать NHibernate для получения результатов со значением ранжирования, поскольку он не сопоставляется с фактическим столбцом в любой таблице.

Есть указатели?

1 Ответ

1 голос
/ 27 июня 2011

(Прежде всего следующий синтаксис будет немного мутным, потому что это из памяти, пожалуйста, проверьте 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>())

вернет PersonDTO, который nhibernate удастся собрать, поскольку каждый элемент в списке выбора соответствует свойству (по имени, регистру, типу) в классе 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]) является надлежащим образом объект управляемого лица

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...