You do still need to override QP in 4.x, but you should create a
NumericRangeQuery/Filter, not a TermRangeQuery (even in 3.6 as well).

NumericRangeQuery is much more efficient (visits far fewer terms) than
TermRangeQuery.

Mike McCandless

http://blog.mikemccandless.com

On Mon, Feb 25, 2013 at 5:50 AM, Paul Taylor <paul_t...@fastmail.fm> wrote:
> In my 3.6 code I was adding numeric field to my index as follows:
>
> public void addNumericField(IndexField field, Integer value) {
>         addField(field, NumericUtils.intToPrefixCoded(value));
>     }
>
>
> but I've chnaged it to (work in progress)
>
> public void addNumericField(IndexField field, Integer value) {
>         FieldType ft = new FieldType();
>         ft.setStored(true);
>         ft.setIndexed(true);
>         ft.setNumericType(FieldType.NumericType.INT);
>         doc.add(new IntField(field.getName(), value, ft));
>     }
>
> whihc seems neater
>
> In 3.6 I also add to override queryparser to make it work for numeric range
> searches, do I still have to do this and if so how do I modify it to work
> for
> IntField.
>
> package org.musicbrainz.search.servlet;
>
> import org.apache.lucene.index.Term;
> import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
> import org.apache.lucene.search.Query;
> import org.apache.lucene.search.TermQuery;
> import org.apache.lucene.search.TermRangeQuery;
> import org.apache.lucene.util.NumericUtils;
> import org.musicbrainz.search.LuceneVersion;
> import org.musicbrainz.search.index.LabelIndexField;
> import org.musicbrainz.search.servlet.mmd1.LabelType;
>
> public class LabelQueryParser extends MultiFieldQueryParser {
>
>     public LabelQueryParser(java.lang.String[] strings,
> org.apache.lucene.analysis.Analyzer analyzer)
>     {
>         super(LuceneVersion.LUCENE_VERSION, strings, analyzer);
>     }
>
>      protected Query newTermQuery(Term term) {
>
>          if(
>                  ( term.field() == LabelIndexField.TYPE.getName())
>
>             ) {
>             try {
>                 int typeId = Integer.parseInt(term.text());
>                 if (typeId >= LabelType.getMinSearchId() && typeId <=
> LabelType.getMaxSearchId()) {
>                     TermQuery tq = new TermQuery(new Term(term.field(),
> LabelType.getBySearchId(typeId).getName()));
>                     return tq;
>                 }
>                 else {
>                     return super.newTermQuery(term);
>                 }
>             }
>             catch(NumberFormatException nfe) {
>                 return super.newTermQuery(term);
>
>             }
>         } else if(
>                 (term.field() == LabelIndexField.CODE.getName())
>                 ){
>             try {
>                 int number = Integer.parseInt(term.text());
>                 TermQuery tq = new TermQuery(new Term(term.field(),
> NumericUtils.intToPrefixCoded(number)));
>                 return tq;
>             }
>             catch (NumberFormatException nfe) {
>                 //If not provided numeric argument just leave as is, won't
> give matches
>                 return super.newTermQuery(term);
>             }
>         } else {
>             return super.newTermQuery(term);
>
>         }
>     }
>
>     /**
>      *
>      * Convert Numeric Fields
>      *
>      * @param field
>      * @param part1
>      * @param part2
>      * @param inclusive
>      * @return
>      */
>     @Override
>     public Query newRangeQuery(String field,
>                                String part1,
>                                String part2,
>                                boolean inclusive) {
>
>         if (
>                 (field.equals(LabelIndexField.CODE.getName()))
>             )
>         {
>             part1 = NumericUtils.intToPrefixCoded(Integer.parseInt(part1));
>             part2 = NumericUtils.intToPrefixCoded(Integer.parseInt(part2));
>         }
>         TermRangeQuery query = (TermRangeQuery)
>                 super.newRangeQuery(field, part1, part2,inclusive);
>         return query;
>     }
>
> }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> For additional commands, e-mail: java-user-h...@lucene.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-user-h...@lucene.apache.org

Reply via email to