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?

Foi útil?

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 é?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top