Hi Dan, Thanks for the input. Serialization errors are now gone.
However, I get this exception now : org.apache.geode.cache.client.ServerOperationException: remote server on UNKNOWN(6217:loner):55000:e60cf1f7: While performing a remote executeRegionFunction at org.apache.geode.cache.client.internal.ExecuteRegionFunctionOp$ExecuteRegionFunctionOpImpl.processResponse(ExecuteRegionFunctionOp.java:442) at org.apache.geode.cache.client.internal.AbstractOp.processResponse(AbstractOp.java:222) at org.apache.geode.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:195) at org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:382) at org.apache.geode.cache.client.internal.AbstractOpWithTimeout.attempt(AbstractOpWithTimeout.java:45) at org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:263) at org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:353) at org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:750) at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:138) at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:785) at org.apache.geode.cache.client.internal.ExecuteRegionFunctionOp.execute(ExecuteRegionFunctionOp.java:92) at org.apache.geode.cache.client.internal.ServerRegionProxy.executeFunction(ServerRegionProxy.java:687) 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) at com.lbc.station.service.controller.*StationController* .testStationsOfInterest(StationController.java:65) at com.lbc.station.service.controller.$StationControllerDefinition$$exec1.invokeInternal(Unknown Source) . . . . . . . . . *Caused by: java.lang.ClassNotFoundException: com.lbc.station.service.controller.StationController* at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686) at org.apache.geode.internal.InternalDataSerializer$DSObjectInputStream.resolveClass(InternalDataSerializer.java:3668) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751) at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1716) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1556) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431) at org.apache.geode.internal.InternalDataSerializer.readSerializable(InternalDataSerializer.java:2846) at org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2790) at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2968) at org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionContext.fromData(LuceneFunctionContext.java:106) at org.apache.geode.internal.InternalDataSerializer.invokeFromData(InternalDataSerializer.java:2372) at org.apache.geode.internal.DSFIDFactory.create(DSFIDFactory.java:997) at org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2668) at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2968) at org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:99) at org.apache.geode.internal.cache.tier.sockets.CacheServerHelper.deserialize(CacheServerHelper.java:73) at org.apache.geode.internal.cache.tier.sockets.Part.getObject(Part.java:351) at org.apache.geode.internal.cache.tier.sockets.Part.getObject(Part.java:359) at org.apache.geode.internal.cache.tier.sockets.command.ExecuteRegionFunction66.cmdExecute(ExecuteRegionFunction66.java:101) at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:183) at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMessage(ServerConnection.java:848) at org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:72) at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1212) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl.lambda$initializeServerConnectionThreadPool$3(AcceptorImpl.java:666) at org.apache.geode.internal.logging.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:121) ... 1 common frames omitted Regards, Ajay Vasudevan On Thu, Jan 30, 2020 at 1:03 AM Dan Smith <dsm...@pivotal.io> wrote: > Hi vas, > > The problem is that your entire query needs to be inside the lamba, like > below: > > index -> { > return new BooleanQuery.Builder() > //Query object must be constructed here, inside > the lambda > Query queryToExecute = new > StandardQueryParser().parse(queryString, "stationNameIndex"); > .add(queryToExecute, BooleanClause.Occur.MUST) > .build(); > }); > > The reason you have to do this is that this entire object is serialized > and evaluated *on the server*. Unfortunately, lucene queries are not > serializable. So in the code you send, the query is constructed on the > client and then we try to serialize it and send it to the server, which > doesn't work. > > //Query is created on the client > Query queryToExecute = new StandardQueryParser().parse(queryString, > "stationNameIndex"); > > LuceneQuery<Long, Station> luceneQuery = > luceneService > .createLuceneQueryFactory() > .setLimit(100) > .create( > "stationNameIndex", > "stations-region", > index -> { > return new BooleanQuery.Builder() > //Using a Query object here that was constructed > outside this block means that it must be serialized to the server. This > won't work. > .add(queryToExecute, BooleanClause.Occur.MUST) > .build(); > }); > > On Wed, Jan 29, 2020 at 3:23 PM vas aj <vasudevan.a...@gmail.com> wrote: > >> 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 >>>>>>>>>> >>>>>>>>>