Changed Query queryToExecute = new StandardQueryParser().parse(queryString, "stationNameIndex"); to Query queryToExecute = new StandardQueryParser().parse(queryString, "stationName");
But still, get the error Caused by: java.io.NotSerializableException: org.apache.lucene.search.PrefixQuery . . . Caused by: org.apache.geode.SerializationException: failed serializing object . . . Caused by: java.io.NotSerializableException: org.apache.lucene.search.PrefixQuery Help is needed, please On Wed, Jan 29, 2020 at 11:13 PM vas aj <vasudevan.a...@gmail.com> wrote: > Rechecked my lucene index on Geode and they are as follows: > > create lucene index --name=stationNameIndex --region=stations-region > --field=stationName,longitude,latitude > --analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer,DEFAULT,DEFAULT > > and in java code > > queryString = "stationName: piccadilly*"; > Query queryToExecute = new StandardQueryParser().parse(queryString, > "stationNameIndex"); > > LuceneQuery<Long, Station> luceneQuery = > luceneService > .createLuceneQueryFactory() > .setLimit(100) > .create( > "stationNameIndex", > "stations-region", > index -> { > return new BooleanQuery.Builder() > .add(queryToExecute, BooleanClause.Occur.MUST) > .build(); > }); > > luceneQuery.findValues() throws Serialization exception but when I use the > > LuceneQuery<Long, Station> luceneQuery = > luceneService > .createLuceneQueryFactory() > .setLimit(100) > .create( > "stationNameIndex", > "stations-region", > queryString, > "stationName" > }); > > It works. > > What has gone wrong? > > On Wed, Jan 29, 2020 at 9:19 PM Xiaojian Zhou <gz...@pivotal.io> wrote: > >> You should use the stationName not station if your object is indexed on >> the field, i.e. stationName. >> >> Even class Station implements DataSerializable, lucene index are still >> only index on the object's fields, such as stationName. >> >> On Wed, Jan 29, 2020 at 1:04 PM vas aj <vasudevan.a...@gmail.com> wrote: >> >>> Sorry >>> queryString = "station: piccadilly*" to get the mentioned error. >>> >>> On Wed, Jan 29, 2020 at 9:01 PM vas aj <vasudevan.a...@gmail.com> wrote: >>> >>>> Hi team, >>>> >>>> The below code : >>>> >>>> queryString = "piccadilly*"; >>>> Query queryToExecute = new StandardQueryParser().parse(queryString, >>>> "stationNameIndex"); >>>> >>>> LuceneQuery<Long, Station> luceneQuery = >>>> luceneService >>>> .createLuceneQueryFactory() >>>> .setLimit(100) >>>> .create( >>>> "stationNameIndex", >>>> "stations-region", >>>> index -> { >>>> return new BooleanQuery.Builder() >>>> .add(queryToExecute, BooleanClause.Occur.MUST) >>>> .build(); >>>> }); >>>> Collection<Station> stations = luceneQuery.findValues(); >>>> >>>> *throws the below error : * >>>> >>>> Error while querying => {} >>>> org.apache.geode.SerializationException: failed serializing object >>>> at >>>> org.apache.geode.internal.cache.tier.sockets.Message.serializeAndAddPart(Message.java:408) >>>> at >>>> org.apache.geode.internal.cache.tier.sockets.Message.addObjPart(Message.java:350) >>>> at >>>> org.apache.geode.internal.cache.tier.sockets.Message.addObjPart(Message.java:329) >>>> at >>>> org.apache.geode.cache.client.internal.ExecuteRegionFunctionSingleHopOp$ExecuteRegionFunctionSingleHopOpImpl.<init>(ExecuteRegionFunctionSingleHopOp.java:180) >>>> at >>>> org.apache.geode.cache.client.internal.ServerRegionProxy.lambda$executeFunction$1(ServerRegionProxy.java:699) >>>> at >>>> org.apache.geode.cache.client.internal.ExecuteRegionFunctionSingleHopOp.constructAndGetExecuteFunctionTasks(ExecuteRegionFunctionSingleHopOp.java:131) >>>> at >>>> org.apache.geode.cache.client.internal.ExecuteRegionFunctionSingleHopOp.execute(ExecuteRegionFunctionSingleHopOp.java:84) >>>> at >>>> org.apache.geode.cache.client.internal.ServerRegionProxy.executeFunction(ServerRegionProxy.java:701) >>>> at >>>> org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.executeOnServer(ServerRegionFunctionExecutor.java:200) >>>> at >>>> org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.executeFunction(ServerRegionFunctionExecutor.java:154) >>>> at >>>> org.apache.geode.internal.cache.execute.ServerRegionFunctionExecutor.execute(ServerRegionFunctionExecutor.java:379) >>>> at >>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findTopEntries(LuceneQueryImpl.java:121) >>>> at >>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findPages(LuceneQueryImpl.java:99) >>>> at >>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findResults(LuceneQueryImpl.java:85) >>>> at >>>> org.apache.geode.cache.lucene.internal.LuceneQueryImpl.findValues(LuceneQueryImpl.java:78) >>>> >>>> whereas >>>> >>>> LuceneQuery<Long, Station> luceneQuery = >>>> luceneService >>>> .createLuceneQueryFactory() >>>> .setLimit(100) >>>> .create( >>>> "stationNameIndex", >>>> "stations-region", >>>> queryString, >>>> "stationName" >>>> }); >>>> >>>> works perfectly & Station implements org.apache.geode.DataSerializable. >>>> >>>> What am I missing?. >>>> Please help. >>>> >>>> Regards, >>>> Aj >>>> >>>> On Tue, Jan 28, 2020 at 11:31 PM Xiaojian Zhou <gz...@pivotal.io> >>>> wrote: >>>> >>>>> Maybe you should change one or both of the "MUST" to "SHOULD". And >>>>> it's better to switch the order of the 2 subqueries. >>>>> >>>>> >>>>> On Tue, Jan 28, 2020 at 2:23 PM vas aj <vasudevan.a...@gmail.com> >>>>> wrote: >>>>> >>>>>> Thanks Dan for the quick help. >>>>>> However the query failed. >>>>>> >>>>>> Working on the same. >>>>>> >>>>>> On Tue, 28 Jan 2020, 19:55 Dan Smith, <dsm...@pivotal.io> wrote: >>>>>> >>>>>>> I think you could probably use a BooleanQuery to do this. Something >>>>>>> like this, although I haven't tested it. Your LuceneQuery1 just results >>>>>>> in >>>>>>> a call to StandardQueryParser.parse, so you can combine that with your >>>>>>> spatial query: >>>>>>> >>>>>>> LuceneQuery<Long, Station> luceneQuery2 = >>>>>>> luceneService >>>>>>> .createLuceneQueryFactory() >>>>>>> .create("stationNameIndex", "stations-region", index -> { >>>>>>> BooleanQuery query = new BooleanQuery(); >>>>>>> query.add(new StandardQueryParser().parse(queryString, >>>>>>> name), BooleanQuery.Occur.MUST); >>>>>>> query.add(SpatialHelper.findWithin(-122.8515139, >>>>>>> 45.5099231, 0.5), , BooleanQuery.Occur.MUST); >>>>>>> return query; >>>>>>> } >>>>>>> >>>>>>> On Tue, Jan 28, 2020 at 11:36 AM vas aj <vasudevan.a...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi team, >>>>>>>> >>>>>>>> I want to execute a *LuceneQuery* that searches both a >>>>>>>> queryString(E.g. "station:Piccadilly*") as well as nearest station >>>>>>>> within >>>>>>>> .5 miles.(E.g. SpatialHelper.findWithin(lat, long, 0.5)) >>>>>>>> >>>>>>>> In other words, is there any means of combining *luceneQuery1* & >>>>>>>> *luceneQuery2* and executing them as >>>>>>>> Collection<Station> nearestStations = *luceneQuery*.findValues(); >>>>>>>> >>>>>>>> where luceneQuery = luceneQuery1 + luceneQuery2 >>>>>>>> >>>>>>>> *LuceneQuery1* >>>>>>>> LuceneQuery<Long, Station> luceneQuery1 = >>>>>>>> luceneService >>>>>>>> .createLuceneQueryFactory() >>>>>>>> .setLimit(100) >>>>>>>> .create("stationNameIndex", "stations-region", >>>>>>>> queryString, "name"); >>>>>>>> >>>>>>>> *LuceneQuery2* >>>>>>>> LuceneQuery<Long, Station> luceneQuery2 = >>>>>>>> luceneService >>>>>>>> .createLuceneQueryFactory() >>>>>>>> .create("stationNameIndex", "stations-region", index -> >>>>>>>> SpatialHelper.findWithin(-122.8515139, 45.5099231, 0.5); >>>>>>>> >>>>>>>> Regards >>>>>>>> Aj >>>>>>>> >>>>>>>