Analizza una stringa di ricerca (in NHibernate Criterias)
-
05-07-2019 - |
Domanda
Vorrei implementare una ricerca avanzata per il mio progetto. La ricerca ora utilizza tutte le stringhe immesse dall'utente e fa una grande disconnessione con i criteri API.
Funziona bene, ma ora vorrei implementare più funzioni: AND, OR e parentesi ()
Ho avuto difficoltà ad analizzare la stringa e a costruire criteri dalla stringa. Ho trovato questa domanda Stackoverflow , ma non ha aiutato davvero (non ha fatto chiarire ciò che voleva).
Ho trovato un altro articolo , ma questo supporta molto di più e sputa le istruzioni sql. Un'altra cosa di cui ho sentito parlare molto è Lucene, ma non sono sicuro che questo mi aiuterebbe davvero.
Ho cercato un po 'in giro e ho trovato Lucene.Net WhitespaceAnalyzer e QueryParser.
Cambia la ricerca A AND B OR C in qualcosa come + A + B C, che è un buon passo nella direzione corretta (più gestisce le parentesi). Il prossimo passo sarebbe quello di ottenere la stringa convertita in un insieme di congiunzioni e disgiunzioni.
Il L'esempio Java che ho trovato stava usando il generatore di query che non riuscivo a trovare in NHibernate.
Altre idee?
Soluzione 2
Quello che sto praticamente facendo in questo momento è analizzare la stringa di input con l'API di analisi Lucene.Net. Questo mi dà una sintassi uniforme e semplificata. (Pseudocodice)
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
}
}
Dopo di che sto analizzando questa stringa manualmente, creando disgiunzioni e congiunzioni.
Altri suggerimenti
Immagino di non aver sentito parlare di Ricerca vietata ??a > fino ad ora
Nhibernate Search utilizza lucene al di sotto e ti offre tutte le opzioni di utilizzo della grammatica AND, OR.
Tutto quello che devi fare è attribuire le tue entità all'indicizzazione e Nhibernate le indicizzerà in una posizione predefinita.
La prossima volta puoi cercare questo indice con la potenza che lucene espone e quindi ottenere in cambio oggetti entità a livello di 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, non è vero?