ElasticSearch里我明明指定了long,为什么却变成了keyword

本文探讨了在ElasticSearch中,属性被意外转换为类型的问题。通过源码分析,揭示了如何在没有外部配置文件的情况下,类型被解析为属性。同时,讨论了项目中使用实体类与分库分表的冲突,以及如何通过封装模板类来实现对索引的动态操作。在数据一致性方面,文章介绍了强一致性和最终一致性策略,包括事务管理和后台同步机制。
摘要由CSDN通过智能技术生成

背景

实体类定义属性idLong类型,但在调用 spring-data-elasticsearch:3.2.10.RELEASE中的putMapping(Class<T>)方法时却被转换成了keyword类型

源码

查看putMapping方法,可以发现最终调用最下边的重载方法

class ElasticsearchRestTemplate {
  ...
  @Override
  public <T> boolean putMapping(Class<T> clazz) {
    return putMapping(clazz, buildMapping(clazz));
  }
​
  @Override
  public <T> boolean putMapping(Class<T> clazz, Object mapping) {
    return putMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType(),
                      mapping);
  }
​
  @Override
  public <T> boolean putMapping(String indexName, String type, Class<T> clazz) {
    return putMapping(indexName, type, buildMapping(clazz));
  }
​
  @Override
  public boolean putMapping(String indexName, String type, Object mapping) {
    Assert.notNull(indexName, "No index defined for putMapping()");
    Assert.notNull(type, "No type defined for putMapping()");
    PutMappingRequest request = new PutMappingRequest(indexName).type(type);
    if (mapping instanceof String) {
      request.source(String.valueOf(mapping), XContentType.JSON);
    } else if (mapping instanceof Map) {
      request.source((Map) mapping);
    } else if (mapping instanceof XContentBuilder) {
      request.source((XContentBuilder) mapping);
    }
    try {
      return client.indices().putMapping(request, RequestOptions.DEFAULT).isAcknowledged();
    } catch (IOException e) {
      throw new ElasticsearchException("Failed to put mapping for " + indexName, e);
    }
  }
  ...
}
复制代码

查看buildMapping方法,因为并没有定义外部mappingPath配置文件,所以走最下边的mappingBuilder.buildPropertyMapping(clazz)来进行解析出String类型的json文件

abstract class AbstractElasticsearchTemplate {
  ...
  protected String buildMapping(Class<?> clazz) {
    // load mapping specified in Mapping annotation if present
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值