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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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,达到节省服务器资源的目的

源码地址

参考链接

SpringDataElasticsearch

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
24天前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
49 5
|
24天前
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
52 3
|
3月前
|
存储 API 数据库
检索服务elasticsearch索引(Index)
【8月更文挑战第23天】
63 6
|
6天前
|
测试技术 API 开发工具
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
21 8
|
5月前
|
存储 JSON 监控
Elasticsearch索引监控全面解析
Elasticsearch索引监控全面解析
106 0
|
2月前
|
JSON 自然语言处理 数据库
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
概念、ik分词器、倒排索引、索引和文档的增删改查、RestClient对索引和文档的增删改查
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
|
2月前
|
存储 搜索推荐 数据建模
Elasticsearch 的数据建模与索引设计
【9月更文第3天】Elasticsearch 是一个基于 Lucene 的搜索引擎,广泛应用于全文检索、数据分析等领域。为了确保 Elasticsearch 的高效运行,合理的数据建模和索引设计至关重要。本文将探讨如何为不同的应用场景设计高效的索引结构,并分享一些数据建模的最佳实践。
99 2
|
3月前
|
存储 运维 搜索推荐
运维开发.索引引擎ElasticSearch.倒序索引的概念
运维开发.索引引擎ElasticSearch.倒序索引的概念
51 1
|
4月前
|
索引
Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
【7月更文挑战第2天】Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
|
3月前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。