Analizar una cadena de búsqueda (en los criterios de NHibernate)
-
05-07-2019 - |
Pregunta
Me gustaría implementar una búsqueda avanzada para mi proyecto. La búsqueda en este momento utiliza todas las cadenas que ingresa el usuario y crea una gran separación con los criterios API.
Esto funciona bien, pero ahora me gustaría implementar más funciones: AND, OR y corchetes ()
Me cuesta mucho analizar la cadena y crear criterios a partir de la cadena. He encontrado esta pregunta de Stackoverflow , pero realmente no ayudó (no hizo es claro lo que quería).
Encontré otro artículo , pero esto Soporta mucho más y escupe declaraciones SQL. Otra cosa que he escuchado mencionar mucho es a Lucene, pero no estoy segura de si esto realmente me ayudaría.
He estado buscando un poco y he encontrado el Lucene.Net WhitespaceAnalyzer y el QueryParser.
Cambia la búsqueda A y B o C en algo como + A + B C, que es un buen paso en la dirección correcta (además de que maneja los soportes). El siguiente paso sería obtener la cadena convertida en un conjunto de conjunciones y disyunciones.
El El ejemplo de Java que encontré estaba usando el generador de consultas que no pude encontrar en NHibernate.
¿Alguna idea más?
Solución 2
Lo que estoy haciendo básicamente ahora es analizar la cadena de entrada con la API de análisis de Lucene.Net. Esto me da una sintaxis uniforme y simplificada. (Pseudocódigo)
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
void Function Search (string queryString)
{
Analyzer analyzer = new WhitespaceAnalyzer();
QueryParser luceneParser = new QueryParser("name", analyzer);
Query luceneQuery = luceneParser.Parse(queryString);
string[] words = luceneQuery.ToString().Split(' ');
foreach (string word in words)
{
//Parsing the lucene.net string
}
}
Después de eso, estoy analizando esta cadena manualmente, creando las disyunciones y las conjunciones.
Otros consejos
Supongo que no has oído hablar de Búsqueda de Nhibernate hasta ahora
Nhibernate Search usa lucene debajo y te da todas las opciones de usar AND, OR, gramática.
Todo lo que tiene que hacer es atribuir sus entidades para la indexación y Nhibernate lo indexará en una ubicación predefinida.
La próxima vez que pueda buscar este índice con el poder que expone Lucene y luego obtener a cambio los objetos de entidad de nivel de dominio.
using (IFullTextSession s = Search.CreateFullTextSession(sf.OpenSession(new SearchInterceptor()))) {
QueryParser qp = new QueryParser("id", new StopAnalyzer());
IQuery NHQuery = s.CreateFullTextQuery(qp.Parse("Summary:series"), typeof(Book));
IList result = NHQuery.List();
Potente, ¿no? # 8217; ¿no?