SpringBoot+Elasticsearch按日期实现动态创建索引(分表)

这篇具有很好参考价值的文章主要介绍了SpringBoot+Elasticsearch按日期实现动态创建索引(分表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: SpringBoot+Elasticsearch按日期实现动态创建索引(分表)
⏱️ @ 创作时间: 2023年02月19日

SpringBoot+Elasticsearch按日期实现动态创建索引(分表)

前言

SpringBoot+Elasticsearch,通过@Document注解,利用EL表达式指定到配置文件,实现动态生成IndexName值,比如:

@Document(indexName = "product_#{@esIndex}")

1、创建动态索引配置文件

在配置文件中按照yyyy_MM_dd格式返回索引值的后缀,并且通过定时任务对索引值实现更新操作,定时任务是通过重建Bean对象实现对esIndex值进行更新。

重建Bean原因:Bean默认只有在服务启动时加载,若需动态改变Bean就要先销毁这个Bean之后再重新加载。


@Configuration
public class EsIndexConfig {

    @Resource
    private ApplicationContext applicationContext;

    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Bean(name = "esIndex")
    public static String esIndex() {
        // 此处模拟按日期创建索引
        // 由于方便测试,索引直接返回时间戳,作为索引名称,时间可以为yyyy-MM-dd
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd");
        String date = sdf.format(new Date());
        System.out.println(date);

        date = System.currentTimeMillis() / 1000 + "";
        System.out.println("date:" + date);
        return date;
    }

    // 每天0点
    @Scheduled(cron = "0 0 0 * * ?")
    public void updateEsIndex() {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
        // 销毁指定实例
        defaultListableBeanFactory.destroySingleton("esIndex");
        String index = EsIndexConfig.esIndex();
        // 重新注册
        defaultListableBeanFactory.registerSingleton("esIndex", index);

        // 对索引进行一次手动创建(因为自动创建会丢失shards参数)
        IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(ProductEntity.class);
        if (!indexOperations.exists()) {
            indexOperations.create();
        }
    }
}

其他做法:
也可以不通过定时任务更新索引值,可以在操作save方法前,判断索引是否存在,如果不存在再进行重建Bean更新索引值,如下实例:

IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(ProductEntity.class);
       if (!indexOperations.exists()) {
           索引不存在,则重建Bean更新索引值
       }

SpringBoot+Elasticsearch按日期实现动态创建索引(分表)

2、创建实体

创建的实体类,需要关闭自动创建index属性(createIndex = false),通过配置文件来创建索引值,原> 因:如果开启自动索引,在项目启动时的第一个索引会完整创建成功,但是后续通过定时任务创建的索引会缺失配置的shards、replicas参数

默认情况下:createIndex属性值为true,在项目启动时就会按照@Document注解中的配置进行索引的创建,为了包装每次创建索引的完整性,需要将createIndex属性值为false

@Document(indexName = "product_#{@esIndex}", createIndex = false, shards = 3, replicas = 2)
@Data
public class ProductEntity implements Serializable {

    @Id
    private String id;

    /**
     * 文本类型,使用ik分词器
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;

    /**
     * 价格
     */
    @Field(type = FieldType.Double)
    private BigDecimal money;

    /**
     * 时间戳
     */
    @Field(type = FieldType.Long)
    private Long time;

    /**
     * 颜色
     */
    @Field(type = FieldType.Keyword)
    private String color;
}

3、Repository对象

Repository接口用于定义Elasticsearch数据访问操作的标准化方法。它提供了一组内置的CRUD(创建、读取、更新、删除)操作,以及其他一些常见的查询方法。

要使用Repository对象,首先需要定义一个继承自ElasticsearchRepository接口的自定义接口,用于操作指定的实体类型。该自定义接口通常称为Repository接口,其中的方法会映射到相应的Elasticsearch数据操作。
比如创建ProductEntity实体对应的Repository接口

public interface ProductRepository extends ElasticsearchRepository<ProductEntity, String> {
    
}

4、Controller对象

测试时,可以将索引动态更新的定时任务时间设置为一分钟,并且返回的索引值由yyyy_MM_dd修改为一个随机数;调用save方法后,过一分钟后再次进行调用,通过head/kibana观察是否生成了新的索引。

@RestController
@RequestMapping("es")
@Slf4j
public class ProductController {

    @Resource
    private ProductRepository productRepository;

    @PostMapping
    public void save() {
        String[] colors = {"red", "purple", "blue"};
        String[] name = {"手机", "电脑", "微波炉", "电视"};
        // 新增列表数据
        List<ProductEntity> testList = new ArrayList<>();
        long sys = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            // 模拟随机数
            double random = Math.random() * 1000;

            ProductEntity productEntity = new ProductEntity();
            productEntity.setId(i + "");
            productEntity.setName(name[i % 4]);
            productEntity.setMoney(new BigDecimal(random));
            productEntity.setTime(sys + i % 3);
            productEntity.setColor(colors[i % 3]);
            testList.add(productEntity);
        }
        // 新增成功后,在head或者kibana中就可以看到相应数据,如果save时数据Id存在则更新操作
        // 批量新增
        productRepository.saveAll(testList);

        // 单个新增
        ProductEntity productEntity = testList.get(9);
        productEntity.setId("11");
        productRepository.save(productEntity);
    }
}

SpringBoot+Elasticsearch按日期实现动态创建索引(分表)文章来源地址https://www.toymoban.com/news/detail-402660.html

到了这里,关于SpringBoot+Elasticsearch按日期实现动态创建索引(分表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot与es集成操作-基础篇3(动态创建索引)

    需求:动态创建索引,数据每天更新,更新后创建新的索引,然后删除原来索引。为了不影响再创建索引的时候影响功能的使用。 前面的添加依赖、yml中增加es配置、实现Repository操作与 springboot与es集成操作-基础篇保持一致。。。。。。 createIndex 默认为true,再启动项目的时

    2024年02月12日
    浏览(38)
  • SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)

    RestHighLevelClient 是 Elasticsearch 官方提供的Java高级客户端,用于与 Elasticsearch 集群进行交互和执行各种操作。 主要特点和功能如下 : 强类型 :RestHighLevelClient 提供了强类型的 API,可以在编码过程中获得更好的类型安全性和 IDE 支持。 兼容性 :RestHighLevelClient 是 Elasticsearch 官方

    2024年02月11日
    浏览(51)
  • springboot es索引@Document通过动态加载bean实现动态改变

    需求:elasticsearch中,每天的数据放在当天的索引中,如2022.08.23。现有一个服务,定时从es中将数据拉取到mysql数据库中存储。 更新:可以通过SPEL进行动态注入 ========================================================================= 考虑的点:java中es映射实体需要@Document注解指定连接的elas

    2024年02月15日
    浏览(34)
  • ElasticSearch7.3学习(十六)----RestHighLevelClient Java api实现索引的创建、删除、是否存在、关闭、开启

    注意:导入的包区别,不同的包创建索引的方式不同。博主亲身实践,具体体现在createIndexRequest.mapping()里面。读者可自行试验。  由此可以猜想一下: 可以看到上述两种方式导入的包的子类名是相同的,但是具体对索引的操作方式可能是不同的。具体的区别博主暂时还不清

    2024年02月16日
    浏览(58)
  • Spring Boot Elasticsearch7.6.2实现创建索引、删除索引、判断索引是否存在、获取/添加/删除/更新索引别名、单条/批量插入、单条/批量更新、删除数据、递归统计ES聚合的数据

    注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6 引入依赖 有时候你可能需要查询大批量的数据,建议加上下面配置文件

    2024年02月13日
    浏览(75)
  • elasticsearch索引操作,索引创建、索引更新、索引删除

    创建索引 更新索引,添加字段 注意更新索引时与创建索引大致一样,只是更新索引时候的url不同,需要在后面加一个 _mapping 路径,同时请求的json里面不需要 mappings 路径,只需要 properties 即可 更新索引,修改配置 同理在更新setting的时候和更新maping的时候一样 获取索引结构

    2024年02月11日
    浏览(46)
  • elasticsearch创建索引模板

    在es数据保存数据,数据量很大时,如日志记录,监控数据等,需要按月或者按日分索引保存,需要创建统一模板来规定数据格式。 可以通过kibana创建 创建模板 创建template之后创建索引

    2024年02月11日
    浏览(50)
  • 使用elasticsearch创建索引时报错

    最近在使用时创建索引的时候 , 出现以上的错误 我的代码如下 : 这个时候出现错误 错误详细信息如下: 解决方法 : 这是因为在使用create方法时 , 会有两个选择 , 其中一个已经过时了 解决 : 查看自己导入的包是哪个 , 使用这个包就可以正常运行了

    2024年02月11日
    浏览(40)
  • elasticsearch中手动创建索引失败

    想通过kibana的dev tool工具或者cerebro工具的rest来手动创建索引 创建失败,错误代码403,错误提示:“reason”: “action [indices:admin/create] is unauthorized for user [分配的es用户名]”} 报错提示: 每个用户在分配用户和角色时被固定了索引格式,如果你的请求操作的目标索引不存在于

    2024年02月13日
    浏览(49)
  • elasticSearch创建索引库、映射、文档

    创建索引库 使用postman或curl这样的工具创建 参数: number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力和高可用性,入门程序使用单机环境,这里设置为1。 number_of_replicas:设置副本的数量,设

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包