前言
一般情况下,当我们使用 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