为增加查询速度,在项目中集成了Elasticsearch,但是在删掉旧的索引,重新建立新的索引时确报错提示说,唯一id已被指定,重新指定id失效(但是此时旧的索引已经被删掉了,新的索引还没创建,所以是否有持久化的配置没有清除掉?);报错详情如图所示:
有相关经验的同学可以帮忙解答一下么,不胜感激~
我是使用的javaAPI操作的es,操作顺序与详情如下:
操作1.使用 ElasticsearchRestTemplate#createIndex(Class<?> clazz )方法创建的索引,代码如下
/**
* 创建索引
*/
@Test
void creatIndex() throws IOException {
//创建索引
boolean result = elasticsearchRestTemplate.createIndex(UserCommentDO.class);
//boolean result = elasticsearchOperations.createIndex(UserCommentDO.class);
//构建映射
elasticsearchRestTemplate.putMapping(UserCommentDO.class);
System.out.println("创建索引结果: " + result);
}
此时旧的索引的结构如下(此时@Id注解标识在 id 字段上,即指定id字段为es的唯一索引)
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("pd_cmtmgr_usercomments")
@Document(indexName = "comment", shards = 5, replicas = 1)
public class UserCommentDO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 自增id
*/
@Id
@Field(type = FieldType.Keyword)
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 评价来源(1:三方,2:企迈,3:饿了么,4:美团,5:自研小程序)
*/
@Field(type = FieldType.Keyword)
@TableField("type_id")
private Integer typeId;
...
}
操作2.随后我使用api将此索引删除掉,意图将es的唯一标识更换到新的字段上;操作删除es索引的代码如下:
/**
* 删除 索引
*/
@Test
void deleteIndex() {
//删除索引
boolean result = elasticsearchRestTemplate.deleteIndex(UserCommentDO.class);
System.out.println("删除索引结果: " + result);
}
操作3.将@Id字段标识到新创建的字段上,代码如下:(指定esUniqueId字段为es的唯一索引)
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("pd_cmtmgr_usercomments")
@Document(indexName = "comment", shards = 5, replicas = 1)
public class UserCommentDO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 自增id
*/
@Field(type = FieldType.Keyword)
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* es中的唯一索引
*/
@Id
@Field(type = FieldType.Keyword)
private String esUniqueId;
操作4.重新执行创建es索引的代码(代码和操作1相同),此时es报错提示,唯一索引id已经被指定到字段id上,重新设置id字段失败。报错详情如下:
org.springframework.data.mapping.MappingException: Attempt to add id property private java.lang.String com.pindao.comment.api.pojo.domain.UserCommentDO.esUniqueId but already have property private java.lang.Long com.pindao.comment.api.pojo.domain.UserCommentDO.id registered as id. Check your mapping configuration!
at org.springframework.data.mapping.model.BasicPersistentEntity.returnPropertyIfBetterIdPropertyCandidateOrNull(BasicPersistentEntity.java:266)
at org.springframework.data.mapping.model.BasicPersistentEntity.addPersistentProperty(BasicPersistentEntity.java:218)
at org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchPersistentEntity.addPersistentProperty(SimpleElasticsearchPersistentEntity.java:210)
at org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchPersistentEntity.addPersistentProperty(SimpleElasticsearchPersistentEntity.java:60)
所以有遇到相同情况的同学么,麻烦帮忙解答一下~