new QueryParser(....).parse("count:[1 TO 10]");
5 Réponses :
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. P>
Vous devez hériter de 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 P> QueryParser code> et remplacer gettrangequery (champ de chaîne, ...) code>. Si champ code> est l'un de vos noms de champ numériques, renvoyez une instance de numericrangequery code>, sinon retourner base.getrangequery (...) code>. p>
Ç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.
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: p> 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: P> réécrit un peu plus bien p> li>
remplacé dans la méthode de NewtermQuery
par 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. P> < ul>
remplacé sur NewterMQuery p>
par 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. P> p>
numericutils.inttoprefixCoded (integer.parseint (term.text (terme.text ()), numericutils.precision_step_default))); code> p>
numericutils.inttoprefixCoded (integer.parseint (term.text (terme.text ()), 0, byterefbuilder); code> p> l> li>
ul> TermQuery TQ = nouvelle TermQuery (nouveau terme (champ, code> p> li>
ul> TERMQUERY TQ = Nouvelle TermQuery (nouveau terme (Term.field (), CODE> P>
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 code>.
Désolé, n'a pas utilisé Lucene depuis lors, ne sera pas en mesure d'aider, veuillez élever un nouveau problème.
à Lucene 6, la méthode protégée Lors de l'indexation de votre champ: p> sur votre analyseur de requête personnalisé (extension QueryParser # GetRangeQuery existe toujours avec la liste des arguments ( Nom de terrain de chaîne, chaîne basse, chaîne élevée, booléen startinclusive, booléen endinclusive) code> et le remplacer pour interpréter la plage en tant que plage numérique est en effet possible, tant que ces informations sont indexées à l'aide de l'un des nouveaux Point code> champs. QueryParser.Classic.QueryParser code>) , remplace la méthode avec quelque chose comme ceci: p>
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);
...