Elasticsearch 如何实现索引的伪·命名空间

Elasticsearch 如何实现索引的伪·命名空间

环境说明

jdk8

elasticsearch7.4.0

springboot 2.3.12.RELEASE

spring-data-elasticsearch 4.0.9.RELEASE

注:本文不做特殊说明的情况下,client1与client2使用相同配置

应用场景

在公司内部资源紧张的情况下,多个项目使用同一个elasticsearch并且数据互不干扰,实现资源的最大化利用,节约成本

集成Elasticsearch

pom(client1与client2相同)

   <parent>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-parent</artifactId>

       <version>2.3.12.RELEASE</version>

       <relativePath/> <!-- lookup parent from repository -->

   </parent>

   <properties>

       <java.version>1.8</java.version>

   </properties>

   <dependencies>

       <dependency>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-web</artifactId>

       </dependency>

       <dependency>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-test</artifactId>

           <scope>test</scope>

       </dependency>

       <dependency>

           <groupId>org.springframework.data</groupId>

           <artifactId>spring-data-elasticsearch</artifactId>

           <version>4.0.9.RELEASE</version>

       </dependency>

   </dependencies>

config(client1与client2相同)

@Configuration

public class RestClientConfig extends AbstractElasticsearchConfiguration {

   @Bean

   @Override

   public RestHighLevelClient elasticsearchClient() {

       final ClientConfiguration clientConfiguration = ClientConfiguration.builder()

               .connectedTo("localhost:9200")

               .build();

       return RestClients.create(clientConfiguration).rest();

   }

}

yml

client1

spring.data.elasticsearch.client.namespace=client1

server.port=8081

client2

spring.data.elasticsearch.client.namespace=client2

server.port=8082

索引名定义(client1与client2相同)

定义变量获取

@Configuration

public class EsConst {

   @Value("${spring.data.elasticsearch.client.namespace}")

   private String elasticsearchNamespace;

   @Bean

   public String getElasticsearchNamespace(){

       return elasticsearchNamespace;

   }

}

新建User 实体类,指定索引名称为namespace.user

@Document(indexName = "#{@getElasticsearchNamespace}.user")

public class User {

   @Field(type = FieldType.Text)

   private String id;

   @Field(type = FieldType.Text)

   private String name;

   @Field(type = FieldType.Text)

   private String phone;

   @Field(type = FieldType.Text)

   private String namespace;

// 省略get/set ......

}

增加测试方法findAll与save

client1

Dao

@Repository

public interface UserDao extends CrudRepository<User,String> {

}

Service

@Service

public class TestService {

   @Autowired

   private UserDao userDao;

   public void findAll(){

       Iterable<User> all = userDao.findAll();

       Iterator<User> iterator = userDao.findAll().iterator();

       User next1 = iterator.next();

       System.out.println(next1.toString());

   }

   public void save(){

       User user = new User();

       user.setId("1");

       user.setName("client1");

       user.setNamespace("elasticsearch:client1");

       user.setPhone("111");

       User save = userDao.save(user);

       System.out.println(save.toString());

   }

}

Test

@RunWith(SpringRunner.class)

@SpringBootTest

public class ClientApplicationTests {

   @Autowired

   private TestService testService;

   @Test

   public void findAll(){

       testService.findAll();

   }

   @Test

   public void save(){

       testService.save();

   }

}

client2

Dao

@Repository

public interface UserDao extends CrudRepository<User,String> {

}

Service

@Service

public class TestService {

   @Autowired

   private UserDao userDao;

   public void findAll(){

       Iterable<User> all = userDao.findAll();

       Iterator<User> iterator = userDao.findAll().iterator();

       User next1 = iterator.next();

       System.out.println(next1.toString());

   }

   public void save(){

       User user = new User();

       user.setId("2");

       user.setName("client2");

       user.setNamespace("elasticsearch:client2");

       user.setPhone("222");

       User save = userDao.save(user);

       System.out.println(save.toString());

   }

}

Test

@RunWith(SpringRunner.class)

@SpringBootTest

public class DemoApplicationTests {

  @Autowired

  private TestService testService;

  @Test

  public void findAll(){

    testService.findAll();

  }

  @Test

  public void save(){

    testService.save();

  }

}

测试验证

预期结果

生成client1.user与client2.user索引

访问8081返回client1用户信息,访问8082返回client2用户信息

实际结果


总结

我们通过增加一个配置类来获取自定义的namespace,然后在类指定索引名时通过获取变量的形式去读取,这样生成的索引就会带一个前缀,也就是我们想要的namespace·,也就实现了我们最初的目标,复用同一个elasticsearch,达到节省服务器资源的目的

源码地址

https://github.com/TianPuJun/es-demo

https://download.csdn.net/download/C1041067258/85096340

参考链接

SpringDataElasticsearch

https://mp.weixin.qq.com/s?__biz=MzIwNzYzODIxMw==&mid=2247484835&idx=1&sn=9140a7a926a3e53c18ea55ec44bc3f6c&chksm=970e1e09a079971fac40682bafc1dbbe26e8636fd2541b4ac549cf7bc27e5d7c74b0952900db#rd

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容