Oddly, enough, this seems to work and I get one result calling Collector.collect(int docIt)...(I found out AND has to be caps)...
author:dean AND date:20110623 but this does not seem to work... author:dean AND date:[ 20110623 TO * ] You would think this second query would return the single result that was returned in the first query, wouldn't it??? I mean it is asking for the same date inclusive and more...why does Collector.collect never get called like nothing matches....stepping through the Lucene code, Scorer is null for some reason and it skips collecting everything because of that. Any ideas? Thanks, Dean -----Original Message----- From: Hiller, Dean x66079 Sent: Sunday, June 19, 2011 4:37 PM To: java-user@lucene.apache.org Subject: RE: ranged query didn't work, got exception... Sweeeet, * worked, but SHUCKS.....query completely returns no results. I don't get it...it gets into the lucene code and since there is no "Scorer" returned, it seems to skip over any results that would be valid :(....any ideas what is wrong with this program.... MyCollector.collect(int docId) never gets called :(. package com.broadridge.papr1.test.other; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Collector; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Scorer; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PlayWithLuceneTest { private final static Logger log = LoggerFactory .getLogger(PlayWithLuceneTest.class); private static final String INDEX_DIR_PREFIX = "output/lucene/lucene-index"; private static final DateTimeFormatter FMT2 = DateTimeFormat .forPattern("yyyyMMdd"); @Test public void playWithLucene() throws Exception { IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_32, new StandardAnalyzer(Version.LUCENE_32)); Directory dir = FSDirectory.open(new File(INDEX_DIR_PREFIX)); IndexWriter writer = new IndexWriter(dir, conf); LocalDate date = new LocalDate(); createAndIndex(writer, "title1", "dean", date, "entry1"); createAndIndex(writer, "title1", "dean2", date.plusDays(8), "entry2"); createAndIndex(writer, "title1", "dean", date.plusDays(4), "entry3"); createAndIndex(writer, "title1", "dean2", date.plusDays(5), "entry4"); createAndIndex(writer, "title1", "dean2", date.plusDays(2), "entry5"); createAndIndex(writer, "title1", "dean2", date.plusDays(6), "entry6"); createAndIndex(writer, "title1", "dean", date.plusDays(9), "entry7"); createAndIndex(writer, "title1", "dean2", date.plusDays(5), "entry8"); writer.optimize(); writer.close(); runSearch(); } private void createAndIndex(IndexWriter writer, String title, String author, LocalDate date, String result) throws IOException { Document document = createDocument(title, author, result, date); writer.addDocument(document); } private void runSearch() throws IOException, ParseException { LocalDate date = new LocalDate(); Directory dir = FSDirectory.open(new File(INDEX_DIR_PREFIX)); IndexSearcher is = new IndexSearcher(dir, true); QueryParser parser = new QueryParser(Version.LUCENE_32, "hello", new StandardAnalyzer(Version.LUCENE_32)); String date1 = FMT2.print(date.plusDays(5)); String queryStr = "date:[" + date1 + " TO * ]"; log.info("query=" + queryStr); Query query = parser.parse(queryStr); MyCollector collector = new MyCollector(is); is.search(query, collector); is.close(); } private static class MyCollector extends Collector { private IndexSearcher is; public MyCollector(IndexSearcher is) { this.is = is; } @Override public void setScorer(Scorer scorer) throws IOException { log.info("scorer=" + scorer); } @Override public void collect(int doc) throws IOException { Document doc2 = this.is.doc(doc); log.info("collect=" + doc + " entry=" + doc2.get("url")); } @Override public void setNextReader(IndexReader reader, int docBase) throws IOException { log.info("reader = " + reader + " docBase=" + docBase); } @Override public boolean acceptsDocsOutOfOrder() { return false; } } private Document createDocument(String title, String author, String url, LocalDate dateWritten) { String dateTxt = FMT2.print(dateWritten); Document document = new Document(); document.add(new Field("author", author, Field.Store.NO, Field.Index.NOT_ANALYZED)); document.add(new Field("title", title, Field.Store.NO, Field.Index.NOT_ANALYZED)); document.add(new Field("date", dateTxt, Field.Store.NO, Field.Index.NOT_ANALYZED)); log.info("created doc=" + dateTxt + " entry+" + url); document.add(new Field("url", url, Field.Store.YES, Field.Index.NO)); return document; } } -----Original Message----- From: Michael Sokolov [mailto:soko...@ifactory.com] Sent: Sunday, June 19, 2011 4:25 PM To: java-user@lucene.apache.org Cc: Hiller, Dean x66079 Subject: Re: ranged query didn't work, got exception... I think you need field:[20020101 TO *] although the "*" option isn't available in some versions (pre 3.1?) and you just have to supply a big value: field:[20020101 TO 99999999] -Mike On 6/19/2011 6:18 PM, Hiller, Dean x66079 wrote: > "here you can simply go for field:[20020101 TO ] and leave the end > blank. If you want to do fast numeric searches you should use > NumericRangeQuery instead." > > I tried that and got an exception... > > I need to do something like String queryStr = "author:dean and date:[" + > date1 + " TO ]"; so can I do a combination of NumericRangeQuery and text > query and is there any example on this? > > org.apache.lucene.queryParser.ParseException: Cannot parse 'author:dean and > date:[20110622 TO ]': Encountered " "]" "] "" at line 1, column 34. > Was expecting one of: > <RANGEIN_QUOTED> ... > <RANGEIN_GOOP> ... > > at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:211) > at > com.broadridge.papr1.test.other.PlayWithLuceneTest.runSearch(PlayWithLuceneTest.java:82) > at > com.broadridge.papr1.test.other.PlayWithLuceneTest.playWithLucene(PlayWithLuceneTest.java:59) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) > at > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) > at > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) > at > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) > at > org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) > at org.junit.runners.ParentRunner.run(ParentRunner.java:236) > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) > Caused by: org.apache.lucene.queryParser.ParseException: Encountered " "]" "] > "" at line 1, column 34. > Was expecting one of: > <RANGEIN_QUOTED> ... > <RANGEIN_GOOP> ... > > at > org.apache.lucene.queryParser.QueryParser.generateParseException(QueryParser.java:1818) > at > org.apache.lucene.queryParser.QueryParser.jj_consume_token(QueryParser.java:1700) > at org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1455) > at > org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1309) > at > org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1266) > at > org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1226) > at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206) > ... 25 more > > > -----Original Message----- > From: Simon Willnauer [mailto:simon.willna...@googlemail.com] > Sent: Sunday, June 19, 2011 11:48 AM > To: java-user@lucene.apache.org > Subject: Re: how to do simple search paging results of 100 each? and query > syntax question > > On Sun, Jun 19, 2011 at 7:29 PM, Hiller, Dean x66079 > <dean.hil...@broadridge.com> wrote: >> On the link >> http://lucene.apache.org/java/3_0_3/queryparsersyntax.html#Range%20Searches >> >> >> There is ranged searched, how do I specify everything above a date from date >> 20020101 to end of time? >> >> >> Next, I am temporarily using lucene in a noSQL solution(to switch to Solr >> later after prototype) and >> >> So I am just indexing basic columns..no need for "top search results", etc. >> >> >> >> When I look at the IndexSearcher and it's list of methods I am not sure how >> I can grab the first 100 >> >> Results, then the second 100 results(that is if I need them), then the third >> 100 results (again if needed) > so what you do here is basically requesting as many documents as you > need lets say 100, then you display it. Once you need the next hundred > you search again requesting 200 results and once the search returns > simply discard the first 100 > use this as the basic method if you simply use a query without filters > or anything. > > public TopDocs search(Query query, int n) >> >> >> I see a TopScoreDocCollector.create method but the >> IndexSearcher.search(Query, Collector) method states only to call that >> method if you need ALL the results. I definitely don't need all but need to >> page through the >> >> Results and typically exit out around the third page. This is not a web >> app, so ideally I want a reference held into the indexed tree so it can keep >> giving me the next 100 results. > in lucene you must search again to the the next 100 but in general the > search should be very fast. > > lemme know if you have more quesitons. > > simon >> >> >> Thanks, >> >> Dean >> >> This message and any attachments are intended only for the use of the >> addressee and >> may contain information that is privileged and confidential. If the reader >> of the >> message is not the intended recipient or an authorized representative of the >> intended recipient, you are hereby notified that any dissemination of this >> communication is strictly prohibited. If you have received this >> communication in >> error, please notify us immediately by e-mail and delete the message and any >> attachments from your system. >> >> > --------------------------------------------------------------------- > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org > For additional commands, e-mail: java-user-h...@lucene.apache.org > > > This message and any attachments are intended only for the use of the > addressee and > may contain information that is privileged and confidential. If the reader of > the > message is not the intended recipient or an authorized representative of the > intended recipient, you are hereby notified that any dissemination of this > communication is strictly prohibited. If you have received this communication > in > error, please notify us immediately by e-mail and delete the message and any > attachments from your system. > This message and any attachments are intended only for the use of the addressee and may contain information that is privileged and confidential. If the reader of the message is not the intended recipient or an authorized representative of the intended recipient, you are hereby notified that any dissemination of this communication is strictly prohibited. If you have received this communication in error, please notify us immediately by e-mail and delete the message and any attachments from your system.