Customize the SOLR Default response to custom Search response - spring

I was working on the POC of accessing the solr via the microservices using spring boot. I am using the Rest template to connect the solr . My query is can we customize the response that solr returns ?.
For Example:
solrUri="http://localhost:8983/solr/microServicesPOC/select?q=:&wt=json"
When we access the above url, the response solr returns has the docuemnts of fields. I need to get the results in the format of my Product pojo.
Snippet:
resEntity = solrConfig.getRestTemplate().exchange(solrUri,HttpMethod.POST,entity , Product.class);
To achieve from the above way of rest template, I need the solr to return response in Product format. Is it possible from SOlr?
I am not using the solrTemplate or the solrJ. I want the customization from the solr side not on the service side .
Tried customizing the searchHandler ,Writing DocTransformer but none of the methods worked .

Related

Elasticsearch client API

my question is about different Elasticsearch client APIs .. I wanted to migrate form Elasticsearch 6.2 to Elasticsearch 7
Currently i am using JEST Client library with elasticsearch v6.2, but its absolute now therefore with the upgrade i wanted to used client library provided by Elasticsearch, but number of libraries provided by Elasticsearch make me lost which one to use with v7.15
these are following ES client libraries
Java client :
deprecated in 7.9
https://www.elastic.co/guide/en/elasticsearch/client/java-api/7.9/java-docs-index.html
REST clients: there are two REST clients
Low level REST client.
request marshalling and response un-marshalling is handled by the client
itself.
internally uses "Apache Http Async Client"
provide some basic domentation of rintailizing, request/response with java code
High Level client
deprecated in 7.15
it a layer on top of Low level client
performs request marshalling and response un-marshalling is handled by the client itself.
provides documentation with Java code
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.15/java-rest-high-document-index.html
so its look like Elasticsearch 7.15 can only use "Low level REST client" because other two clients " Java client " and "RES High Level clien" are deprecated.
and using REST LOW level client require to write lots of basic codes like marschalling /un-marshalling etc
is my understating correct ?
is there any other Elasticsearch client available /better to use to migrate to 7.15 ?
You are right, this is the only way for this version.
But starting with 7.16 version there is a new client ⇾ ElasticsearchClient handling marshalling and unmarshalling by itself (You pass class type as a parameter with calls) with already pretty neet documentation existing:
https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/master/connecting.html

Elasticsearch Rest client for Query DSL

I am trying to write a method using ElasticsearchRestTemplate to fetch data from elasticsearch using query DSL ]. I looked into the documentation, but the documentation is not clear to me how to get the data from elasticsearch using java. Can anyone please help me how to fetch data from elasticsearch using Java client ( ElasticsearchRestTemplate ) by query DSL?
Spring Data Elasticsearch does not support QueryDsl.

Elastic search high/low rest client vs spring rest template

I am in a dilemma over to use spring's rest template or elasticsearch's own high/low rest client while searching in es . Does es client provide any advantage like HTTP connection pooling , performance while compared to spring rest template . Which of the two take less time in getting response from the server . Can some one please explain this ?
The biggest advantage of using Spring Data Elasticsearch is that you don't have to bother about the things like converting your requests/request bodies/responses from your POJO domain classes to and from the JSON needed by Elasticsearch. You just use the methods defined in the ElasticsearchOperations class which is implemented by the *Template classes.
Or going one abstraction layer up, use the Repository interfaces the all the Spring Data modules provide to store and search/retrieve your data.
Firstly, This is a very broad question. Not sure if it suits the SO guidelines.
But my two cents:
High Level Client uses Low Level client which does provide connection pooling
High Level client manages the marshalling and unmarshalling of the Elastisearch query body and response, so it might be easier to work using the APIs.
On the other hand, if you are familiar with the Elasticsearch querying by providing the JSON body then you might find it a bit difficult to translate between the JSON body and the Java classes used for creating the query (i.e when you are using Kibana console or other REST API tools)
I generally overcome this by logging the query generated by the Java API so that I can use it with Kibana console or other REST API tools.
Regarding which one is efficient- the library will not matter that much to affect the response times.
If you want to use Spring Reactive features and make use of WebClient, ES Libraries do provide support for Async search.
Update:
Please check the answer by Wim Van den Brande below. He has mentioned a very valid point of using Transport Client which has been deprecated over REST API.
So it would be interesting to see how RestTemplate or Spring Data ElasticSearch will update their API to replace TransportClient.
One important remark and caveat with regards to the usage of Spring Data Elasticsearch. Currently, Spring Data Elasticsearch doesn't support the communication by the High Level REST Client API. They are using the transport client. Please note, the TransportClient is deprecated as of Elasticsearch 7.0.0 and is expected to be removed in Elasticsearch 8.0!!!
FYI, this statement has been confirmed already by another post: Elasticsearch Rest Client with Spring Data Elasticsearch

Return hazelcast data as json if read from REST

I implemented session replication using hazelcast on my spring boot app. And also exposed hazelcast data through rest by enabling 'hazelcast.rest.enabled' property.
I am saving some java objects with Portable serialization on to session as attributes. Session attributes saved under SessionState object, this object is returned if I query hazelcast map using cookie id.
If I access hazelcast using REST client:
http://member IP address:port/hazelcast/rest/maps/mapName/key
I get data back that is not in json format. Is it possible to return this data in json?
I think that currently the endpoint always returns the plain text only. I don't see any possibility of choosing the response structure based on the input parameters (that's the part in the code).

Refreshing the ElasticSearch index from RDBMS using Spring Data

I have the following setup :
Mysql RDBMS server
Elastic Search Server
My requirement is to copy data periodically from MYSQL RDBMS and update Elastic server with it.Currently i am following the approach below :
A Batch Job which reads all data from MYSQL using Spring Data Jpa
It then pushes all data to elastic server using spring data elastic
This approach is very cumbersome and not efficient.Is there a way where i can read only the updated values using spring data and update the index accordingly in elastic.
Using jdbc-river etc is not an option for me as the application uses Spring data elastic to get data and search over elastic search,with jdbc-river it will not be able to function properly i think.

Resources