不是为Long类型自动生成id,而是为Spring Data Elasticsearch中的String类型字段生成

时间:2017-08-01 07:31:40

标签: java spring spring-data-elasticsearch

我正在使用相同版本的spring boot版本1.5.6.RELEASEspring-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而无需添加任何注释。

2 个答案:

答案 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字段包含您设置的值。