7
votes

Comment faire le QueryParser à Lucene Gardez des gammes numériques?

new QueryParser(....).parse("count:[1 TO 10]");

0 commentaires

5 Réponses :


1
votes

QueryParser ne créera pas de NumericrangeQuerye car il n'a aucun moyen de savoir si un champ était indexé avec Numericfield. Il suffit de prolonger le QueryParser pour gérer ce cas.


0 commentaires

2
votes

Vous devez hériter de QueryParser et remplacer gettrangequery (champ de chaîne, ...) . Si champ est l'un de vos noms de champ numériques, renvoyez une instance de numericrangequery , sinon retourner base.getrangequery (...) .

Il existe un exemple d'une telle implémentation dans ce thread: http://www.mail-archive.com/java-user@lucène.apache.org/msg29062.html


3 commentaires

Ça ne marche pas! On dirait que GetRangeQuery n'est pas remplacé.


A travaillé pour moi, bien que cette question ait plus de trois ans et je ne me souviens plus de détails.


C'estokey, j'ai réussi à résoudre mon problème en utilisant BoolQuery. Mais cette méthode ne fonctionne pas pour moi à Lucene4.



7
votes

avait le même problème et l'a résolu, alors je partage ma solution:

Pour créer un analyseur de requête personnalisé qui analysera la requête suivante "Infield_name: 1203" ou "IntField_Name: [1 à 10]" et gérer le champ infield_name comme un infield, J'ai annulé la nouvelle température avec les éléments suivants: xxx

J'ai pris le code cité dans ce fil de http: //www.mail -Archive.com/search?l=java-user@lucène.apache.org&q=subject:%22re%3a+How+do+you+Properly+use+Numericfield%22&o=newest&f=1 et fabriqué 3 Modifications:

  • réécrit un peu plus bien

  • remplacé dans la méthode de NewtermQuery numericutils.inttoprefixCoded (integer.parseint (term.text (terme.text ()), numericutils.precision_step_default)));

    par numericutils.inttoprefixCoded (integer.parseint (term.text (terme.text ()), 0, byterefbuilder);

    Lorsque j'ai utilisé cette méthode pour la première fois dans un filtre sur le même champ numérique, je mets 0 car je l'ai trouvé comme une valeur par défaut dans une classe Lucene et cela vient de travailler. < ul>

  • remplacé sur NewterMQuery

    TermQuery TQ = nouvelle TermQuery (nouveau terme (champ,

    par TERMQUERY TQ = Nouvelle TermQuery (nouveau terme (Term.field (),

    Utilisation de "champ" est faux, car si votre requête a plusieurs Clauses (Champ: Texte ou IntField: 100), il prend le premier ou le champ de la clause précédente.


2 commentaires

Je sais que cela fait longtemps que vous avez répondu cela, mais j'ai toujours des problèmes même après avoir remplacé la méthode de NewtermQuery. Je reçois toujours la requête «Longfield: Bytes» contient une sous-requête basée sur une chaîne qui cible (s) champ codé numérique .


Désolé, n'a pas utilisé Lucene depuis lors, ne sera pas en mesure d'aider, veuillez élever un nouveau problème.




0
votes

J'ai adapté Jeremies Répondre pour C # et Lucene.net 3.0.3. J'ai aussi besoin de type double au lieu d'int. Ceci est mon code:

...
    double? part1Dbl = null;
    double tmpDbl;
    if (part1 != "*")
    {
        if (!double.TryParse(part1, DblNumberStyles, CultureInfo.InvariantCulture, out tmpDbl))
            throw new ParseException($"Error parsing value {part1} for field {field} as double.");
        part1Dbl = tmpDbl;
    }
    double? part2Dbl = null;
    if (part2 != "*")
    {
        if (!double.TryParse(part2, DblNumberStyles, CultureInfo.InvariantCulture, out tmpDbl))
            throw new ParseException($"Error parsing value {part2} for field {field} as double.");
        part2Dbl = tmpDbl;
    }
    return NumericRangeQuery.NewDoubleRange(field, part1Dbl, part2Dbl, inclusive, inclusive);
...


0 commentaires