我对通过弹性 Spring Boot 数据进行一些自动化实现有疑问。
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "super_test_index")
public class TestIndex {
@Field(type = FieldType.Keyword)
private String id;
@Field(type = FieldType.Text)
private String text;
@CreatedDate
private Instant createDate;
@LastModifiedDate
private Instant updateDate;
@Version
private Long indexVersion;
}
添加了存储库
@Repository
public interface TestRepository extends ElasticsearchRepository<TestIndex, String> {
}
并实现了简单的代码
@Service
@RequiredArgsConstructor
public class TestService {
private final TestRepository testRepository;
public TestIndex save() {
TestIndex testIndex = TestIndex.builder()
.id(UUID.randomUUID().toString())
.text("test")
.build();
return testRepository.save(testIndex);
}
public TestIndex update(String id, String text) {
TestIndex testIndex = testRepository.findById(id).orElseThrow();
testIndex.setText(text);
return testRepository.save(testIndex);
}
}
并通过控制器调用它
@RestController
@RequiredArgsConstructor
public class TestController {
private final TestService testService;
@PostMapping("/api/test/save")
public TestIndex save() {
return testService.save();
}
@PostMapping("/api/test/update")
public TestIndex update(@RequestParam("id") String id, @RequestParam("text") String text) {
return testService.update(id, text);
}
}
在创建时我得到了更新的文档
{
"id": "9a16210a-3ab7-4d52-bcd2-ec87f46cc403",
"text": "test",
"createDate": null,
"updateDate": null,
"indexVersion": 1
}
但是更新它
"exception": "Elasticsearch exception [type=version_conflict_engine_exception, reason=[9a16210a-3ab7-4d52-bcd2-ec87f46cc403]: version conflict, current version [1] is higher or equal to the one provided [1]]; nested exception is [super_test_index/e03tZCuoRzeJB2SpVQIefQ][[super_test_index][0]] ElasticsearchStatusException[Elasticsearch exception [type=version_conflict_engine_exception, reason=[9a16210a-3ab7-4d52-bcd2-ec87f46cc403]: version conflict, current version [1] is higher or equal to the one provided [1]]]"
收到错误消息。所以我有几个问题:
我刚刚发现一些关于我必须配置版本控制(如“外部版本”)的信息,但我不知道如何通过 Spring Boot 来做到这一点。我对 jpa 存储库/实体做了同样的事情,但从未对弹性做过。
如何通过 Spring Boot 来做到这一点
Spring Data Elasticsearch 不是 Spring Boot。
索引的版本管理可以使用
versionType
注释的@Document
属性来定义。
请注意,当前版本的 Elasticsearch 文档 (https://www.elastic.co/guide/en/elasticsearch/reference/8.11/optimistic-concurrency-control.html) 仅描述了使用 _seq_no 的乐观锁定和 _primary_term (Spring Data Elasticsearch 也支持)。使用版本字段是之前执行此操作的方法,您最好迁移。
还有一件事: 请使用
@Id
注释您的 id 属性,而不是依靠名称来检测它,您可以省略 id 字段上的 @Field
注释。