Elasticsearch使用Index()方法刷新数据的一些小坑

当使用Spring Data Elasticsearch的index方法更新数据时,若未正确设置id和version,可能导致数据重复而非更新。需确保IndexQuery使用withVersion及withId,以实现高效数据同步更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题
	我们在使用spring-data-elasticsearch中的ElasticsearchTemplate类中的index方法去更新
elasticsearch数据库中的同样数据的时候,如果你发现了index()方法之后发现数据是增加了,
而不是更新了数据库中原来的那条数据,而是多了一条数据,原来的老数据还在,那么你可以看下你
的es实体类中是否设置了id,version,如果设置了,那就证明是这两者同时来控制数据的不重复,那么
你的IndexQuery一定要withVersion(),withVersionType()(老版本中有,新版本中已取消),withId(),
设置之后数据就可以同步更新了,当然你也可以使用save()方法,但是这个方法效率没有index()快,
因为save()方法内部就是调用了inddex().并且refresh()。源码如下:

 public <S extends T> S save(S entity) {
    Assert.notNull(entity, "Cannot save 'null' entity.");
    this.elasticsearchOperations.index(this.createIndexQuery(entity));
    this.elasticsearchOperations.refresh(this.entityInformation.getIndexName());
    return entity;
}
   
    private IndexQuery createIndexQuery(T entity) {
    IndexQuery query = new IndexQuery();
    query.setObject(entity);
    query.setId(this.stringIdRepresentation(this.extractIdFromBean(entity)));
    query.setVersion(this.extractVersionFromBean(entity));
    query.setParentId(this.extractParentIdFromBean(entity));
    return query;
	}
   index()里面设置id,version()版本的原因在这!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值