2011-11-10 12 views
5

que tengo que hacer la búsqueda de texto completo en NHibernateNHibernate + SqlServer buscar con texto completo

Por siguiente operación previamente estoy usando Lucene.Net

tengo una tabla llamada candidato

Para consulta de texto completo Lucene devolverá todos los Id de candidato del índice de Lucene y formará esa identificación que puse en consulta en candidato y devolverá el resultado

Pero el problema es que hay más de 10 Falta de currículum candidato disponible, por lo que Lucene es muy lento porque valor de filtro de 10 fila Lc y poner valor de retorno en consulta contra candidato y filtrar nuevamente candidato está tomando demasiado tiempo

También tengo un criterio de búsqueda y para cada página vuelvo 100 candidatos

ahora he añadido nuevo tabla candidate_full_text en esa mesa configuré índice de texto completo en SQL Server 2000 ahora quiero realizar consultas mediante NHibernate DetachedCriteria de la siguiente manera

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) 

a raíz de las cosas que tengo que hacer en la consulta individual con DetachedCriteria Y el columna de clave de índice candidate_full_text es candidato ID tablas .. modelos de mesa Aquí he dado de 1) candidato (campos min)

Id - int,

Nombre - varchar,

Dob - fecha y hora,

2) candidate_full_text

id - int,

candidate_resume_full_text -ntext, (índice de texto completo está configurado)

candidate_id - int

+2

No contaría con la búsqueda de texto completo, especialmente no en Sql Server 2000, para ser más rápido que lucene. Lucene es generalmente muy rápido, incluso para grandes cantidades de datos. ¿Ha considerado eliminar la consulta IN al poner todos los datos necesarios en lucene, para evitar el golpe al servidor Sql por completo? –

+0

Estoy buscando sqlserver búsqueda de texto completo de lucene por una razón más lógica que técnica ... no puedo poner todos los datos en lucene porque para orm estoy usando nhibernate..im usando lucene para un solo propósito, es decir, búsqueda de texto completo – Anand

+0

Estoy de acuerdo con Jonas H. que Lucene en general es una solución mucho más eficiente que SQL FTS. Sin embargo, si el rendimiento del SQL FTS es adecuado, usarlo le brinda la ventaja de poder unir de manera relacional los resultados del FTS (a través de las funciones CONTAINSTABLE o FREETEXTTABLE) con otros datos relacionales, lo que facilita mucho el filtrado y la agrupación realmente complejos. . –

Respuesta

2

Si usted es capaz de utilizar SQL Server FTS en lugar de Lucene y el rendimiento es aceptable, puede tomar ventaja de la capacidad de hacer uniones relacionales entre los resultados de SQL Server FTS y los otros datos relacionales en su base de datos. Para hacer estas uniones, debe usar la función CONTAINSTABLE, en lugar del predicado CONTAINS.

Usando su ejemplo, vamos a configurar las siguientes tablas en 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) 
) 

A continuación, puede crear una consulta con nombre parametrizado en NHibernate algo en este sentido:

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

Nota cómo esto consulta relacionalmente une los resultados de la función CONTAINSTABLE a otra tabla en su base de datos. Al usar SQL FTS, es fácil unir resultados de FTS con consultas relacionales complejas sobre los otros datos en su base de datos. Esta capacidad es uno de los beneficios clave del uso de SQL Server FTS sobre Lucene y puede ser una razón para elegirlo a través de Lucene a pesar de su peor rendimiento general.

Por último, puede rellenar sus parámetros en su aplicación de C# y ejecutar la consulta utilizando el objeto 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() función no está disponible en SQL Server 2000, que está utilizando , pero creo que hay otras soluciones alternativas para hacer paging (ver por ejemplo this article). (O quizás desee actualizar su SQL Server a 2008, que ejecuta FTS en proceso y tiene un rendimiento mucho mejor)

Creo que una solución en esta línea satisfará sus necesidades.