Hi team, RESOLVED the error by adding dependency "spatial4j-0.7.jar" in docker container,
Log file @ <<my-server-name>>/my-server-name.log gave me the clue of Spatial4J class was not found ! Regards, Aj On Fri, Jan 31, 2020 at 10:04 PM vas aj <vasudevan.a...@gmail.com> wrote: > Hi team, > > I am trying to query lucene documents and then query by > 1) Station name > 2) Stations with Longitude and Latitude radius of 10 miles > > I created StationLuceneLongLatSerializer as > public class StationLuceneLongLatSerializer implements > LuceneSerializer<Station> { > @Override > public Collection<Document> toDocuments(LuceneIndex luceneIndex, Station > station) { > Document doc = new Document(); > // Index title of Station > doc.add(new TextField("title", station.getTitle(), Field.Store.YES)); > > Field[] fields = > SpatialHelper.getIndexableFields(Station.getLongitude(), > Station.getLatitude()); > > for (Field field : fields) { > doc.add(field); > } > > return Collections.singleton(doc); > } > } > > and created lucene index as > create lucene index --name=stationLuceneIndex --region=station > --field=title --analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer > --serializer=StationLuceneLongLatSerializer > > While I retrieve documents using below query : > String[] queries = new String[] {"mong*"}; > String[] fields = new String[] {"title"}; > > Query query1 = QueryParserUtil.parse(queries, fields, new > EnglishAnalyzer()); > Query queryFinal = > new BooleanQuery.Builder() > .add(query1, BooleanClause.Occur.MUST) > .build(); > > String queryString = queryFinal.toString("title"); > System.out.println("query from util => " + queryString); > > LuceneQuery<Long, EbayBike> luceneQuery = > luceneService > .createLuceneQueryFactory() > .setLimit(100) > .create("ebayBikeLuceneIndex", "ukBikes", queryString, "title"); > > Collection<EbayBike> ebayBikes = luceneQuery.findValues(); > > I get ZERO rows, but when I create lucene index like below(serializer is > removed...) > > create lucene index --name=stationLuceneIndex --region=station > --field=title --analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer > --serializer=StationLuceneLongLatSerializer > > I get 3 rows. > > Where have I gone wrong? > > Regards, > Aj > > On Thu, Jan 30, 2020 at 7:42 PM vas aj <vasudevan.a...@gmail.com> wrote: > >> 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 >>>>>>>>>>>> >>>>>>>>>>>