lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Uwe Schindler" <...@thetaphi.de>
Subject RE: How do you properly use NumericField
Date Sun, 11 Oct 2009 18:13:06 GMT
I forgot: The format of numeric fields is also not plain text, because of
this a simple TermQuery as generated by your query parser will not work,
too.

If you want to hit numeric values without a NumericRangeQuery with lower and
upper bound equal, you have to use NumericUtils to translate the term text,
e.g. new TermQuery(new Term("field",
NumericUtils.intToPrefixCoded(value,precstep)))

If you want support for this in QueryParser, you have to override
QueryParser.newTermQuery as explained before for newRangeQuery. By the way,
Solr does this in exactly that way.

Uwe

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe@thetaphi.de


> -----Original Message-----
> From: Uwe Schindler [mailto:uwe@thetaphi.de]
> Sent: Sunday, October 11, 2009 8:08 PM
> To: java-user@lucene.apache.org; paul_t100@fastmail.fm
> Subject: RE: How do you properly use NumericField
> 
> As we told you before. The default QueryParser has no support fro
> NumericField (as it doesn't know the schema). To get it running, subclass
> it
> and overwrite newRangeQuery method to create a NumericRangeQuery for field
> names that are indexed using NumericField.
> 
> The recommended way is to instantiate the NumericQueries directly and not
> via a query parser. You can combina a text query with query parser then
> together with various numeric ranges using a BooleanQuery on top of it. If
> you really need a query string range representation for numeric values,
> there is no way around extending QueryParser.
> 
> -----
> Uwe Schindler
> H.-H.-Meier-Allee 63, D-28213 Bremen
> http://www.thetaphi.de
> eMail: uwe@thetaphi.de
> 
> > -----Original Message-----
> > From: Paul Taylor [mailto:paul_t100@fastmail.fm]
> > Sent: Sunday, October 11, 2009 7:58 PM
> > Cc: Michael McCandless; Lucene Users
> > Subject: Re: How do you properly use NumericField
> >
> > Michael McCandless wrote:
> > > On the indexing side you do this:
> > >
> > >     doc.add(new NumericField("price").setDoubleValue(19.99));
> > >
> > > The NumericField is not stored by default (there's also a ctor to
> > > specify Store.YES or Store.NO).
> > >
> > > If the numeric field is not being used in a range query, how is it
> > > being used?  EG for sorting, it will just work.  If you did store the
> > > field, when you retrieve it, it will come back as a normal field with
> > > a String value (equal to the .toString of original numeric value).
> > >
> > > (You can play with precisionStep, to trade off disk space &
> > > performance; especially if you will do range querying and eg only
> > > sorting, you should set precisionStep=Integer.MAX_VALUE; but these are
> > > advanced optimizations).
> > >
> > > Mike
> > >
> > Hmm, Im being dense here but even a simple non range search doesn't seem
> > to work when using Numeric Fields, in the test below it matches 789 okay
> > but not 123
> >
> > Paul
> >
> > package org.musicbrainz.search.analysis;
> >
> > import junit.framework.TestCase;
> > import org.apache.lucene.analysis.Analyzer;
> > import org.apache.lucene.analysis.standard.StandardAnalyzer;
> > import org.apache.lucene.store.RAMDirectory;
> > import org.apache.lucene.index.IndexWriter;
> > import org.apache.lucene.document.Document;
> > import org.apache.lucene.document.NumericField;
> > import org.apache.lucene.document.Field;
> > import org.apache.lucene.search.IndexSearcher;
> > import org.apache.lucene.search.Query;
> > import org.apache.lucene.queryParser.QueryParser;
> >
> > public class NumericFieldTest extends TestCase {
> >
> >     public void testNumericFields() throws Exception {
> >         Analyzer analyzer = new StandardAnalyzer();
> >         RAMDirectory dir = new RAMDirectory();
> >         IndexWriter writer = new IndexWriter(dir, analyzer, true,
> > IndexWriter.MaxFieldLength.LIMITED);
> >         Document doc = new Document();
> >         NumericField nf  = new NumericField("dur");
> >         nf.setIntValue(123);
> >         doc.add(nf);
> >         doc.add(new Field("dur", "789",
> > Field.Store.NO,Field.Index.ANALYZED ));
> >         writer.addDocument(doc);
> >         writer.close();
> >
> >         IndexSearcher searcher = new IndexSearcher(dir,true);
> >         {
> >             Query q = new QueryParser("dur",analyzer).parse("789");
> >             assertEquals(1, searcher.search(q,10).totalHits);
> >
> >             q = new QueryParser("dur",analyzer).parse("123");
> >             assertEquals(1, searcher.search(q,10).totalHits);
> >
> >
> >         }
> >     }
> >
> >
> > }
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org



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


Mime
View raw message