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

前言

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

你可能感兴趣的:(elasticsearch,java,大数据)