I am using spring boot
application of version 1.5.6.RELEASE
and spring-boot-starter-data-elasticsearch
of the same version.
I have a model Greeting
as like :
@Document(indexName = "index", type = "greetings")
public class Greeting implements Serializable{
@Id
private Long id;
private String username;
// Getter, Setter and constructor added here
}
My controller and service classes are same for the below cases without the type of id
.
When I have sent the below post request:
curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is test"}' http://localhost:8080/api/greetings
It replies:
{"id":null,"username":"sunkuet02","message":"this is test"}
Then I have changed the Greeting
class changing the type of id
to String.
@Document(indexName = "index", type = "greetings")
public class Greeting implements Serializable{
@Id
private String id;
private String username;
// Getter, Setter and constructor added here
}
Clean, build and send the same post request:
curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is test"}' http://localhost:8080/api/greetings
And got the below response :
{"id":"AV2cq2OXcuirs1TrVgG6","username":"sunkuet02","message":"this is test"}
The scenario is : When the type of id
field is Long
then it doesn't generate id automatically but if the type is String
then it generates id automatically.
My questions are:
spring-data-elasticsarch
always uses id
field of type String
? id
of type Long
without adding any annotations.Spring Data Elasticsearch uses _id
internally as Id
and _id
type is String. When you used @Id on your document field, and your data type is String, spring data ES mapped its internal _id
to your fields. But when you use numeric (Long, Integer, etc.) data type, spring data ES can't map its auto-generated _id
to your @Id field. If you see your document on ES, you will see that your document id field is null, and _id
get's auto-generated value.
What you can do is, generate your own id
and set it in your document, then spring data ES will set the String value of that field in its internal _id
field. And you will see your document id field contains the value you set.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With