Hi
Lucene range queries and filters work on string comparison, not numeric. You'll need to pad out any numeric fields you want to use in a range to a consistent length. There may be a class floating around that does this - NumberUtils or NumberTools or something like that. -- Ian. On Mon, Aug 18, 2008 at 3:38 PM, nukie <[EMAIL PROTECTED]> wrote: > > Hi! I've made a sample program for testing lucene : > package indexer; > > import com.sun.xml.internal.bind.v2.schemagen.xmlschema.Occurs; > > import com.sun.xml.internal.ws.util.StringUtils; > > import java.io.BufferedWriter; > import java.io.File; > > import java.io.FileWriter; > > import java.util.Random; > > import org.apache.lucene.analysis.Analyzer; > import org.apache.lucene.analysis.standard.StandardAnalyzer; > import org.apache.lucene.document.Document; > import org.apache.lucene.document.Field; > import org.apache.lucene.index.IndexWriter; > import org.apache.lucene.index.Term; > import org.apache.lucene.queryParser.MultiFieldQueryParser; > import org.apache.lucene.queryParser.QueryParser; > import org.apache.lucene.search.BooleanClause; > import org.apache.lucene.search.BooleanQuery; > import org.apache.lucene.search.Hits; > import org.apache.lucene.search.IndexSearcher; > import org.apache.lucene.search.Query; > import org.apache.lucene.search.RangeFilter; > import org.apache.lucene.search.RangeQuery; > import org.apache.lucene.search.Sort; > import org.apache.lucene.search.TermQuery; > > public class LuceneToster > { > String [] makes = {"BMW", "AUDI", "LAMBOGINI", "FIAT", "SUZUKI", > "SUBARU", "OPEL"}; > String [] models = {"QUATTRO", "A1", "A4", "M1", "PANDA", "GyBSY", > "BuzzZ", "Defender"}; > String [] milleages = {"1000", "2000", "3000", "5000", "6000", "7000", > "8000", "9000"}; > > public LuceneToster() > { > } > > private Document generateRandomDocument() > { > Document doc = new Document(); > Random r = new Random(); > doc.add(new Field("Make", makes[r.nextInt(makes.length)], > Field.Store.YES, Field.Index.UN_TOKENIZED)); > doc.add(new Field("Model", models[r.nextInt(models.length)], > Field.Store.NO, Field.Index.UN_TOKENIZED)); > doc.add(new Field("Milleage", String.valueOf(r.nextInt(10000)), > Field.Store.YES, Field.Index.UN_TOKENIZED)); > for(int i = 0; i < 5; i++) > { > doc.add(new Field("asdasdDDDa_^^asd(8"+String.valueOf(r.nextInt(15)), > models[r.nextInt(models.length)], Field.Store.NO, > Field.Index.UN_TOKENIZED)); > } > return doc; > } > > public void generateIndex(String dir) > { > try > { > IndexWriter luceneWriter = new IndexWriter(dir, new > StandardAnalyzer(), true); > long time = System.currentTimeMillis(); > for(int i = 0; i < 2000000; i++) > { > if(i%10000 == 0) > { > luceneWriter.close(); > luceneWriter = new IndexWriter(dir, new StandardAnalyzer(), > false); > System.out.println("Current i : " + String.valueOf(i)); > } > luceneWriter.addDocument(generateRandomDocument()); > } > long timeEst = System.currentTimeMillis() - time; > System.out.println("Generation time : " + String.valueOf(timeEst)); > luceneWriter.optimize(); > luceneWriter.close(); > }catch(Exception e) > { > e.printStackTrace(); > } > } > > public void doSearch(String indexDir) > { > try > { > IndexSearcher searcher = new IndexSearcher(indexDir); > > TermQuery audiTerm = new TermQuery(new Term("Make", "AUDI")); > > BooleanQuery someAudi = new BooleanQuery(); > someAudi.add(audiTerm, BooleanClause.Occur.MUST); > Hits hits; > long time = System.currentTimeMillis(); > hits = searcher.search(someAudi, new RangeFilter("Milleage", "5000", > "5100", true, true)); > > long newTime = System.currentTimeMillis(); > System.out.println("Search time : " + String.valueOf(newTime - time) + > " RESULT SIZE : " + String.valueOf(hits.length())); > > File f = new File("newf.txt"); > BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt")); > > for(int i = 0; i < hits.length(); i++) > { > bw.write("Document : " + > hits.doc(i).getField("Milleage").stringValue() + " Make: " > +hits.doc(i).get("Make") + "\n"); > } > bw.close(); > > }catch(Exception e) > { > e.printStackTrace(); > } > > } > > public static void main(String[] args) > { > LuceneToster luceneToster = new LuceneToster(); > String indexDir = args[0]; > > if(args[1].equals("index_mode")) > { > luceneToster.generateIndex(indexDir); > }else if(args[1].equals("search_mode")) > { > luceneToster.doSearch(indexDir); > }else > { > System.out.println("Invalid arguments!"); > } > } > } > > It should give results with Milleage field being in range from 5000 to 5100 > , but i have results included with 509 "Milleage" for example. As i suppose > it not correct filtering criteria ? Or it's a bug ? > Thanks > -- > View this message in context: > http://www.nabble.com/Search-Result-Filtering-tp19033114p19033114.html > Sent from the Lucene - Java Users mailing list archive at Nabble.com. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]