基于SpringDataElasticsearch+SpEL表达式实现ES动态索引

本文介绍了如何在多租户系统中利用SpringDataElasticsearch和SpEL表达式动态获取索引,以实现不同租户用户数据的索引隔离。通过动态索引类、数据模型和存储库的实现,详细阐述了动态索引的创建和测试过程,并强调了在实现过程中需要注意的细节,包括确保索引名称动态获取以及防止项目启动时的索引错误。
摘要由CSDN通过智能技术生成

前言

一般情况下,当我们使用 SpringDataElasticsearch 去操作 ES 时,索引名称都会在 @Document 注解中写死,每次都是对这个固定的索引进行操作。

假如我们现在处于一个多租户系统中,每个租户都有自己所对应的用户数据,而这些用户数据都会被导入到 ES 中,那怎么实现各个租户的用户数据索引隔离呢?

换言之,在同一个索引结构的情况下怎么实现一个租户一个索引?

解决方案:使用 SpEL 表达式动态获取索引。

实现

动态获取索引类

DynamicIndex.java

package cn.xeblog.userprovider.es;

import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;

/**
 * 动态索引
 *
 * @author anlingyi
 * @date 2022/2/19 6:52 下午
 */
@Component
public class DynamicIndex {

    private static final ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 获取索引名称后缀
     *
     * @return
     */
    public String getSuffix() {
        return THREAD_LOCAL.get();
    }

    /**
     * 设置索引名称后缀
     *
     * @param suffix
     */
    public void setSuffix(String suffix) {
        THREAD_LOCAL.set(suffix);
    }

    /**
     * 移除当前索引
     */
    public void remove() {
        THREAD_LOCAL.remove();
    }

    /**
     * 获取当前索引
     *
     * @return
     */
    public String getIndex() {
        if (StrUtil.isBlank(getSuffix())) {
            return null;
        }

        return "use
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值