nhibernate - ¿Cómo puedo filtrar mis resultados de búsqueda lucene?
lucene.net nhibernate.search (3)
Diga que mi requisito es
"search for all users by name, who are over 18"
Si estuviera usando SQL, podría escribir algo como:
Select * from [Users]
Where ([firstname] like ''%'' + @searchTerm + ''%'' OR
[lastname] like ''%'' + @searchTerm + ''%'')
AND [age] >= 18
Sin embargo, tengo dificultades para traducir esto en lucene.net.
Esto es lo que tengo hasta ahora:
var parser = new MultiFieldQueryParser({ "firstname", "lastname"}, new StandardAnalyser());
var luceneQuery = parser.Parse(searchterm)
var query = FullTextSession.CreateFullTextQuery(luceneQuery, typeof(User));
var results = query.List<User>();
¿Cómo agrego el "donde la edad> = 18" bit?
Escuché sobre .SetFilter()
, pero esto solo acepta LuceneQueries, y no IQueries. Si SetFilter
es lo correcto para usar, ¿cómo hago el filtro apropiado? Si no, ¿qué uso y cómo lo hago?
¡Gracias!
PD. Esta es una versión muy simplificada de lo que estoy tratando de hacer para mayor claridad, mi cláusula WHERE
es en realidad mucho más complicada que la que se muestra aquí. En realidad, necesito comprobar si existen identificadores en las subconsultas y verificar una serie de propiedades no indexadas. Cualquier solución dada necesita apoyar esto.
Gracias
Para el campo de edad necesita una búsqueda de rango , escrita en la sintaxis de Lucene algo así como:
age:[18 TO 100]
Como dijo Gandalf, puedes usar un QueryWrapperFilter . No estoy seguro de que esto exista en Nhibernate Search. De manera similar, puede usar "Y" para restringir aún más su consulta. No estoy seguro de qué puede hacer con las propiedades sin indizar.
Use un QueryWrapperFilter.
Al final, terminé con NHibernate.Search y simplemente hablé directamente con lucene para obtener los ID, luego los pasé a una cláusula HQL where, mucho más simple y más eficiente.
Editar: Hay una restricción en NH.Search que impide que esto funcione. Puede ser simplemente parcheado, pero una vez que haya leído el código NHS, se dará cuenta de lo terriblemente ineficiente que es. Ir directamente a Lucene es la mejor opción.