Analisar uma seqüência de pesquisa (em NHibernate Características)
-
05-07-2019 - |
Pergunta
Eu gostaria de implementar uma pesquisa avançada para o meu projeto. A busca agora usa todas as cordas que o usuário entra e faz um grande disjunção com critérios API.
Esta multa funciona, mas agora eu gostaria de implementar mais recursos: AND, OR e colchetes ()
Eu tenho um tempo difícil analisar a string - e construir critérios da string. Eu descobri esta questão Stackoverflow, mas realmente não ajuda (ele não fez claro o que queria).
Eu encontrei outra artigo , mas esta suportes muito mais e cospe instruções SQL. Outra coisa que eu já ouvi falar um monte é Lucene - mas eu não tenho certeza se isso realmente iria me ajudar
.Eu tenho procurado em torno de um pouco e eu encontrei a Lucene.Net WhitespaceAnalyzer eo QueryParser.
Ele muda a pesquisa A e B ou C em algo como + A + B C, que é um bom passo na direção correta (mais ele lida com colchetes). O próximo passo seria obter a cadeia convertida em um conjunto de conjunções e disjunções.
O exemplo Java Eu encontrei estava usando o construtor de consulta que eu não poderia encontrar em NHibernate.
Qualquer mais idéias?
Solução 2
O que eu estou basicamente fazendo agora é analisar a cadeia de entrada com o Lucene.Net parse API. Isso me dá uma uniforme e sintaxe 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
}
}
Depois que eu estou analisando esta corda manualmente, criando as disjunções e conjunções.
Outras dicas
Acho que você não ouvi sobre Nhibernate Pesquisa até agora
Nhibernate Search usa debaixo Lucene e dá u todas as opções usando AND, OR, gramática.
Tudo que você tem a fazer é atributo de suas entidades para indexação e vontade Nhibernate-lo em um local pré-definido.
Da próxima vez que você pode pesquisar esse índice com o poder que expõe Lucene e, em seguida, obter o seu domínio objetos de entidade nível em troca.
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();
poderosa, não é?