Question

Je souhaite mettre en œuvre une recherche avancée pour mon projet. La recherche utilise maintenant toutes les chaînes saisies par l’utilisateur et fait une grande disjonction avec l’API des critères.

Cela fonctionne bien, mais j'aimerais maintenant implémenter davantage de fonctionnalités: AND, OR et parenthèses ()

J'ai du mal à analyser la chaîne - et à définir les critères de construction à partir de celle-ci. J'ai trouvé cette question de Stackoverflow , mais cela n'a pas vraiment aidé (il n'a pas fait clairement ce qu'il voulait).

J'ai trouvé un autre article , mais ce prend en charge beaucoup plus et crache des instructions SQL. Lucene est une autre chose que j'ai beaucoup entendu parler, mais je ne suis pas sûr que cela puisse vraiment m'aider.

J'ai cherché un peu et j'ai trouvé Lucene.Net WhitespaceAnalyzer et QueryParser.

Cela change la recherche A AND B OR C en quelque chose comme + A + B C, ce qui est un bon pas dans la bonne direction (en plus, il gère les crochets). La prochaine étape consisterait à convertir la chaîne convertie en un ensemble de conjonctions et de disjonctions.

Le L'exemple Java que j'ai trouvé utilisait le générateur de requêtes que je n'ai pas trouvé dans NHibernate.

D'autres idées?

Était-ce utile?

La solution 2

Ce que je suis en train de faire actuellement, c’est d’analyser la chaîne d’entrée avec l’API d’analyse Lucene.Net. Cela me donne une syntaxe uniforme et simplifiée. (Pseudocode)

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
    }
}

Après cela, j'analyse cette chaîne manuellement et crée les disjonctions et les conjonctions.

Autres conseils

Imaginez que vous n’ayez pas entendu parler de Nhibernate Search jusqu'à maintenant

Nhibernate Search utilise lucene en dessous et vous donne toutes les options d’utilisation de la grammaire AND, OR.
Tout ce que vous avez à faire est d’attribuer vos entités à l’indexation et Nhibernate l’indexera à un emplacement prédéfini.
La prochaine fois que vous pourrez rechercher cet index avec la puissance exposée par lucene, puis récupérez vos objets d'entité de niveau domaine.

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();

Puissant, n'est-ce pas?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top