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
>>>>>>>>>
>>>>>>>>

Reply via email to