Полнотекстовый поиск NHibernate + SqlServer

Мне нужно выполнить полный текстовый поиск в NHibernate

Для последующей операции я использую Lucene.Net

У меня есть таблица под названием «кандидат»

Для полного текстового запроса Lucene вернет весь идентификатор кандидата из индекса lucene и сформирует этот id, который я поставил в запросе в кандидате, и вернул результат

Но проблема в том, что существует более 10 Недостаточное резюме кандидатов, так что Lucene очень медленная, потому что значение фильтра из 10 строк Lk и значение возврата для запроса в кандидате и снова фильтр-кандидат занимает слишком много времени

Также у меня есть критерии подкачки, и для каждой страницы я возвращаю 100 кандидатов

теперь я добавил новую таблицу кандидат_full_text в этой таблице, я сконфигурировал полный текстовый индекс в sqlserver 2000, теперь я хочу запросить с помощью NHibernate DetachedCriteria следующим образом

1) Select candidate with some filters 2) Execute the function ContainsTable for candidate_full_text table (which returns candidate tables id as key and rank of occurrence of the search string) 3) join the result from 1 & 2 4) Apply paging criteria (ie return 1st 100,2nd 100,3rd 100.. etc) according to page no 5) return the result by order of rank column (which is return by ContainsTable) 

Следующие действия, которые я должен выполнить в одном запросе с помощью DetachedCriteria И ключевым столбцом для index_full_text является идентификатор идентификаторов кандидатов. Здесь приведены таблицы моделей 1) кандидата (минимальные поля)

Id – int,

Имя – варчар,

Dob – дата и время,

2) candidate_full_text

id – int,

candid_resume_full_text -ntext (сконфигурированный полнотекстовый индекс)

candid_id – int

Если вы можете использовать SQL Server FTS вместо Lucene, и производительность приемлема, вы можете воспользоваться возможностью выполнять реляционные объединения между результатами FTS SQL Server и другими реляционными данными в вашей базе данных. Чтобы выполнить эти объединения, вы должны использовать функцию CONTAINSTABLE вместо предиката CONTAINS.

Используя ваш пример, давайте настроим следующие таблицы в SQL Server:

 create table Candidate ( Id int primary key, Name varchar(50), Dob datetime ) create table Candidate_Full_Text ( id int primary key, candidate_resume_full_text ntext, -- FTS column candidate_id int foreign key references Candidate(Id) ) 

Затем вы можете создать параметризованный именованный запрос в nHibernate в следующих строках:

 <sql-query name="CandidateSearch"> <![CDATA[ SELECT TOP (:take) * FROM (SELECT c.Id, c.Name, ft.[RANK], ROW_NUMBER() OVER(ORDER BY ft.[RANK] desc) as rownum FROM ContainsTable(Candidate_full_text, candidate_resume_full_text , :phrase, LANGUAGE 1033) ft INNER JOIN Candidate c on ft.[KEY] = c.Id WHERE c.Name = :name and c.Dob > :dob ) a WHERE a.rownum > :skip ORDER BY a.rownum ]]> </sql-query> 

Обратите внимание, как этот запрос реляционно присоединяет результаты функции CONTAINSTABLE к другой таблице в вашей базе данных. Используя SQL FTS, легко присоединиться к результатам FTS со сложными реляционными запросами по другим данным в вашей БД. Эта возможность является одним из ключевых преимуществ использования SQL Server FTS над Lucene и может быть причиной выбора ее по сравнению с Lucene, несмотря на более низкую общую производительность.

Наконец, вы можете заполнить свои параметры в своем приложении C # и выполнить запрос, используя объект nHibernate ISession:

  int take = 5; int skip = 10; string phrase = "(team NEAR player) OR (teamwork NEAR coopertive)"; string name = "John Doe"; DateTime dob = new DateTime(1963, 7, 1); var results = _session.GetNamedQuery("ExpandedSearchTerm") .SetString("phrase", phrase) .SetDateTime("dob", dob) .SetString("phrase", phrase) .SetInt32("take", take) .SetInt32("skip", skip) .List(); 

Функция ROWNUMBER () недоступна в SQL Server 2000, которую вы используете, но я думаю, что для выполнения подкачки существуют другие способы работы (см., Например, эту статью ). (Или вы можете обновить свой SQL Server до 2008 года, который запускает FTS в процессе и имеет гораздо лучшую производительность!)

Я думаю, что решение в этом направлении удовлетворит ваши потребности.

  • Тайм-аут NHibernate с SQL Server
  • Естественная сортировка в NHibernate
  • NHibernate запрос выборки linq для нескольких соединений с подзапросом вызывает неправильный sql
  • SqlCeException-выражения в списке ORDER BY не могут содержать агрегированные функции
  • NHibernate с полным текстом SQL Server
  • Работа с UTC, TimeZone и создание GROUP BY с помощью LocalTime
  • Установить TimeOut Истек срок действия в NHibernate
  • Каков наилучший способ хранения массива байтов в базе данных SQL с помощью NHibernate?
  • «Не удалось выполнить ошибку запроса» в веб-службах с NHibernate
  • Создать hilo с помощью sql
  • SQL Server, какова современная технология наилучшего случая ORM для .Net?
  • Interesting Posts

    SQL Server 2008 R2: сопоставить имя псевдонима со значением столбца

    Как создать ограничение sql для новой или обновленной записи

    SQL Server избегает потери точности

    Конвертирование Unicode в Unicode

    Хранимая процедура SQL Server с использованием связанного сервера

    Как я могу преодолеть ограничение на 8000 символов OpenXML?

    Как эта сумма перешла в правильный столбец – SQL Server

    Потоки данных в случае слияния

    Как перемещаться по нескольким папкам и нескольким файлам и удалять данные в таблицы SQL с одинаковым именем файла? SSIS

    Запрос SQL для получения последней записи каждой минуты

    Сервер Sql использует сводную функцию для реструктуризации данных

    «Ошибка в соединении» при использовании команды insert для доступа к db с помощью ado.net C #

    Получите первые 1 результаты из sql-результатов, основанных на самой высокой версии в sql-сервере

    выберите группу count () по году и месяцу?

    Вставьте CSV-файл в Azure SQL из Azure Blob

    Давайте будем гением компьютера.