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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top