如何使用spring-data-elasticsearch API获取Elasticsearch文档的_version当前值
如何使用Spring Data Elasticsearch API获取Elasticsearch文档
_version字段值 方法1:实体类注解自动映射
直接在你的ES文档实体类上添加Spring通用的@Version注解,Spring Data Elasticsearch会自动将该字段和ES原生的_version元字段绑定,查询、新增、更新操作后都会自动填充对应的值。
实体类示例代码:
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Document(indexName = "foos") public class FooDocument { @Id private String id; // 自动映射ES的`_version`元字段 @Version private Long version; @Field(type = FieldType.Text) private String yourBusinessField; // 省略getter、setter方法 }
使用示例:
// 按ID查询后直接从实体获取版本号 Optional<FooDocument> docOpt = fooRepository.findById("FQOO93sBMpiRC0Jqlyn8"); if (docOpt.isPresent()) { Long currentVersion = docOpt.get().getVersion(); } // 新增/更新操作后,返回的实体直接携带最新版本号 FooDocument savedDoc = fooRepository.save(new FooDocument()); Long newVersion = savedDoc.getVersion();
方法2:通过ElasticsearchOperations直接从查询结果元数据获取
如果不想在实体类额外加version字段,可以直接从SearchHit对象中读取元数据中的版本值:
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.query.GetQuery; import javax.annotation.Resource; public class EsVersionService { @Resource private ElasticsearchOperations elasticsearchOperations; public Long getDocVersion(String indexName, String docId) { GetQuery getQuery = GetQuery.builder().id(docId).build(); SearchHit<FooDocument> hit = elasticsearchOperations.getOne(getQuery, FooDocument.class); return hit != null ? hit.getVersion() : null; } }
注意事项
@Version注解属于Spring Data通用组件,包路径为org.springframework.data.annotation.Version,不要导错包- 如果你同时开启了乐观锁功能,更新时传入的version和ES当前存储的version不一致时会抛出乐观锁异常,此时可重新查询获取最新的version值
内容的提问来源于stack exchange,提问作者Rpj
相关产品推荐
相关产品推荐

