我正在使用相同版本的spring boot
版本1.5.6.RELEASE
和spring-boot-starter-data-elasticsearch
。
我有一个模型Greeting
,如:
@Document(indexName = "index", type = "greetings")
public class Greeting implements Serializable{
@Id
private Long id;
private String username;
// Getter, Setter and constructor added here
}
对于没有id
类型的以下情况,我的控制器和服务类是相同的。
当我发送以下帖子请求时:
curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is test"}' http://localhost:8080/api/greetings
它回复:
{"id":null,"username":"sunkuet02","message":"this is test"}
然后我更改了Greeting
类,将id
的类型更改为String。
@Document(indexName = "index", type = "greetings")
public class Greeting implements Serializable{
@Id
private String id;
private String username;
// Getter, Setter and constructor added here
}
清理,构建并发送相同的帖子请求:
curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is test"}' http://localhost:8080/api/greetings
得到以下回复:
{"id":"AV2cq2OXcuirs1TrVgG6","username":"sunkuet02","message":"this is test"}
方案:当id
字段的类型为Long
时,它不会自动生成ID,但类型为String
然后它会自动生成id。
我的问题是:
spring-data-elasticsarch
是否始终使用id
类型的String
字段? id
类型Long
而无需添加任何注释。答案 0 :(得分:2)
我将解释这一部分:
实际原因是什么? spring-data-elasticsarch总是使用String类型的id字段吗?
Elasticsearch默认生成的ID是20个字符长,URL安全,Base64编码的GUID字符串。
原因当然是性能 - 使用修改的Flake ID允许在索引数据时每秒增加查找次数。一般来说 - Lucene的基于段的性质促进了ID被分配给段或具有一定可预测性的ID。
因此,如果您的应用程序并不真正关心id应该如何,最好坚持使用Elsticsearch提供的默认ID。
此article中的更多信息使用自动ID或选择一个好的身份。
答案 1 :(得分:1)
Spring Data Elasticsearch 在内部使用_id
作为Id
,_id
类型为String。在文档字段上使用@Id并且数据类型为String时,spring数据ES将其内部_id
映射到您的字段。但是当您使用数字(长整数等)数据类型时,弹簧数据ES无法将其自动生成的_id
映射到您的@Id字段。如果您在ES上看到自己的文档,则会看到您的文档ID字段为空,_id
获取自动生成的值。
您可以做的是,生成您自己的id
并在文档中设置它,然后Spring数据ES将在其内部_id
字段中设置该字段的字符串值。您将看到您的文档ID字段包含您设置的值。