SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)

这篇具有很好参考价值的文章主要介绍了SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot整合mongodb

实现步骤:

  1. pom文件导坐标

    <!--mongo-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <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>
    
  2. yaml配置文件配置mongodb:

    spring:
      data:
        mongodb:
          uri: mongodb://localhost/spring
    
  3. 随便建一个pojo

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Book {
        private int id;
        private String name;
        private String type;
        private String description;
    }
    
  4. 测试:

    @SpringBootTest
    class SpringbootMongodb01ApplicationTests {
    
      @Autowired(required = false)
      private MongoTemplate mongoTemplate;
    
      @Test
      void contextLoads() {
        Book book = new Book();
        book.setId(4);
        book.setName("张三");
        book.setType("牛逼");
        book.setDescription("真牛逼");
        mongoTemplate.save(book);
      }
    
      @Test
      void find(){
        List<Book> all = mongoTemplate.findAll(Book.class);
        System.out.println(all);
      }
    }
    

    装配MongoTemplate模板类,调用方法

整合MongoDB总结:

  1. 导坐标
  2. 写配置文件
  3. 核心类MongoTemplate调用

SpringBoot整合ElasticSearch

前提准备:数据库+ES

数据库建表语句:

DROP TABLE IF EXISTS `tb_hotel`;
CREATE TABLE `tb_hotel`  (
  `id` bigint(20) NOT NULL COMMENT '酒店id',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店名称',
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店地址',
  `price` int(10) NOT NULL COMMENT '酒店价格',
  `score` int(2) NOT NULL COMMENT '酒店评分',
  `brand` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店品牌',
  `city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所在城市',
  `star_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店星级,1星到5星,1钻到5钻',
  `business` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商圈',
  `latitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '纬度',
  `longitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '经度',
  `pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店图片',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;

实现步骤:

  1. pom文件到坐标

    <properties>
      <!--锁定jdk版本-->
      <java.version>1.8</java.version>
      <!--锁定es版本-->
      <elasticsearch.version>7.12.0</elasticsearch.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.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
      </dependency>
    
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.2</version>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.29</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
      </dependency>
      <!--FastJson-->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.71</version>
      </dependency>
    </dependencies>
    
  2. yaml配置文件

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/spring?serverTimezone=GMT
        username: root
        password: 123456
    logging:
      level:
        com.dong: debug
    mybatis-plus:
      configuration:
        map-underscore-to-camel-case: true
      type-aliases-package: com.dong.pojo
    
  3. 创建实体类:

    对应数据库表的实体类

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @TableName("tb_hotel")
    public class Hotel {
      @TableId(type = IdType.INPUT)
      private Long id;
      private String name;
      private String address;
      private Integer price;
      private Integer score;
      private String brand;
      private String city;
      private String starName;
      private String business;
      private String longitude;//经度
      private String latitude;//纬度
      private String pic;
    }
    

    对应ES的实体类

    @Data
    @NoArgsConstructor
    public class HotelDoc {
      private Long id;
      private String name;
      private String address;
      private Integer price;
      private Integer score;
      private String brand;
      private String city;
      private String starName;
      private String business;
      private String location;
      private String pic;
    // 构造方法用于类型转换   将数据库中的经、纬度用坐标location代替,所以HotelDoc稍有不同
      public HotelDoc(Hotel hotel){   
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", "+ hotel.getLongitude();
        this.pic = hotel.getPic();
      }
    }
    
  4. mapper层:

    @Mapper
    public interface HotelMapper extends BaseMapper<Hotel> {
    }
    
  5. service层:

    接口:

    public interface IHotelService extends IService<Hotel> {
    }
    

    实现类:

    @Service
    public class HotelServiceImp extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {
    }
    
  6. 演示在juint中进行,演示对索引库和文档的操作

索引库的操作

  • 判断索引库是否存在(其实就是查询)
  • 创建索引库
  • 删除索引库
@SpringBootTest
class SpringbootEs01ApplicationTests {
	// 操作es的核心对象
  private RestHighLevelClient client;
	// 单元测试之前都执行的,告诉核心对象es的端口号  固定语法
  @BeforeEach
  void setUp(){
    this.client = new RestHighLevelClient(RestClient.builder(
      HttpHost.create("http://localhost:9200")
    ));
  }
	// 单元测试之后都执行的
  @AfterEach
  void tearDown() throws Exception{
    this.client.close();
  }

  // 判断索引库是否存在
  @Test
  void testExistsHotelIndex() throws Exception {
    GetIndexRequest request = new GetIndexRequest("hotels");
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    System.err.println(exists ? "索引库已经存在":"索引库不存在");
  }

  // 创建索引库
  @Test
  void createHotelIndex() throws Exception{
    // 创建Request对象
    CreateIndexRequest request = new CreateIndexRequest("hotels");
    // 准备请求的参数:DSL语句
    request.source(HotelConstants.MAPPING_TEMPLATE, XContentType.JSON);
    // 发送请求
    client.indices().create(request,RequestOptions.DEFAULT);
  }

  // 删除索引库
  @Test
  void delteHotelIndex() throws Exception{
    // 创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("hotels");
    // 发送请求
    client.indices().delete(request,RequestOptions.DEFAULT);
  }
}

创建索引库的时候需要映射,映射往往是一个复杂且长的JSON,所以单独写个类,上面创建索引库的映射如下

可以在postman中写好粘贴过来

public class HotelConstants {
  public static final String MAPPING_TEMPLATE = "{\n" +
    "  \"mappings\": {\n" +
    "    \"properties\": {\n" +
    "      \"id\": {\n" +
    "        \"type\": \"keyword\"\n" +
    "      },\n" +
    "      \"name\":{\n" +
    "        \"type\": \"text\",\n" +
    "        \"analyzer\": \"ik_max_word\",\n" +
    "        \"copy_to\": \"all\"\n" +
    "      },\n" +
    "      \"address\":{\n" +
    "        \"type\": \"keyword\",\n" +
    "        \"index\": false\n" +
    "      },\n" +
    "      \"price\":{\n" +
    "        \"type\": \"integer\"\n" +
    "      },\n" +
    "      \"score\":{\n" +
    "        \"type\": \"integer\"\n" +
    "      },\n" +
    "      \"brand\":{\n" +
    "        \"type\": \"keyword\",\n" +
    "        \"copy_to\": \"all\"\n" +
    "      },\n" +
    "      \"city\":{\n" +
    "        \"type\": \"keyword\",\n" +
    "        \"copy_to\": \"all\"\n" +
    "      },\n" +
    "      \"starName\":{\n" +
    "        \"type\": \"keyword\"\n" +
    "      },\n" +
    "      \"business\":{\n" +
    "        \"type\": \"keyword\"\n" +
    "      },\n" +
    "      \"location\":{\n" +
    "        \"type\": \"geo_point\"\n" +
    "      },\n" +
    "      \"pic\":{\n" +
    "        \"type\": \"keyword\",\n" +
    "        \"index\": false\n" +
    "      },\n" +
    "      \"all\":{\n" +
    "        \"type\": \"text\",\n" +
    "        \"analyzer\": \"ik_max_word\"\n" +
    "      }\n" +
    "    }\n" +
    "  }\n" +
    "}";
}

文档的操作

@SpringBootTest
public class HotelDocumentTests {
  // 核心对象
  private RestHighLevelClient client;

  // 需要从数据库中查数据存入es,装配业务
  @Autowired(required = false)
  private IHotelService service;

  @BeforeEach
  void setUp(){
    this.client = new RestHighLevelClient(RestClient.builder(
      HttpHost.create("http://localhost:9200")
    ));
  }

  @AfterEach
  void tearDown() throws  Exception{
    this.client.close();
  }

  // 从数据库新增一条数据到es
  @Test
  void addDocument() throws Exception{
    // 从数据库查询一条数据
    Hotel hotel = service.getById(395434);
    System.out.println(hotel);
    // 转换为文档类型
    HotelDoc hotelDoc = new HotelDoc(hotel);
    // 将文档类型转为JSON格式
    String json = JSON.toJSONString(hotelDoc);
    // 准备request请求对象
    IndexRequest request = new IndexRequest("hotels").id(hotelDoc.getId().toString());
    // 准备JSON文档
    request.source(json, XContentType.JSON);
    // 发送请求
    client.index(request, RequestOptions.DEFAULT);
  }

  // 从es中删除一条数据
  @Test
  void deleteDocument() throws Exception{
    // 准备删除请求Request
    DeleteRequest request = new DeleteRequest("hotels", "395434");
    // 发送请求
    client.delete(request,RequestOptions.DEFAULT);
  }

  // 修改es中的数据
  @Test
  void updateDocument() throws  Exception{
    // 准备修改请求UpdateRequest
    UpdateRequest request = new UpdateRequest("hotels", "395434");
    // 准备请求参数(要修改的数据内容)
    request.doc(
      "name","W酒店",
      "city","西安",
      "price","2000",
      "starName","五星级"
    );
    // 发送请求
    client.update(request, RequestOptions.DEFAULT);
  }

  // 从es中查询一条数据
  @Test
  void getDocumentById() throws  Exception{
    // 准备查询请求GetRequest
    GetRequest getRequest = new GetRequest("hotels", "395434");
    // 发送请求,得到响应
    GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
    // 解析响应结果
    String json = response.getSourceAsString();
    HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);
    System.out.println(hotelDoc);
  }

  // 批量新增数据到es
  @Test
  void addAllDocument() throws  Exception{
    // 数据库全查
    List<Hotel> hotels = service.list();
    // 准备请求
    BulkRequest bulkRequest = new BulkRequest();
    // 准备参数
    for(Hotel hotel : hotels){
      // 类型转化
      HotelDoc hotelDoc = new HotelDoc(hotel);
      // 请求添加数据
      bulkRequest.add(new IndexRequest("hotels").id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));
    }
    // 发送请求
    client.bulk(bulkRequest,RequestOptions.DEFAULT);
  }

  // 解析对象方法
  public void show(SearchResponse response){
    // 解析响应
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    System.out.println("总计查询数据:"+total+"条");
    SearchHit[] hits = searchHits.getHits();
    for(SearchHit hit :hits){
      /// 获取文档source
      String json = hit.getSourceAsString();
      // 反序列化
      HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
      System.out.println("hotelDoc="+hotelDoc);
    }
  }
  /*---------- 全查 ------------*/
  // 全查
  @Test
  void findAllDocument() throws IOException{
    // 准备request
    SearchRequest request = new SearchRequest("hotels");

    // 2.准备DSL,QueryBuilders构造查询条件
    request.source().query(QueryBuilders.matchAllQuery());

    // 3.发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  /*-------------- 全文检索 ---------------*/
  // 查询all字段内容中含有如家的
  @Test
  void testMacth() throws IOException{
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    // 准备DSL
    request.source().
      query(QueryBuilders.matchQuery("all","如家"));

    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  // 查询字段name、city中有上海的
  @Test
  void testMultiMatchQuery()throws IOException {
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    // 准备DSL
    request.source()
      .query(QueryBuilders.multiMatchQuery("上海","name","city"));
    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  /*------------ 精确查询 ------------------*/

  // term:根据词条精准查询(字段等值查询)
  @Test
  void testTerm() throws  IOException{
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    // 准备DSL
    request.source()
      .query(QueryBuilders.termQuery("brand","希尔顿"));

    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  // range范围查询
  @Test
  void  testRange() throws IOException {
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    // 准备DSL
    request.source()
      .query(QueryBuilders.rangeQuery("price").gte(200).lte(300));
    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  // ids查询
  @Test
  void testIds() throws IOException  {
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    // 准备DSL
    request.source()
      .query(QueryBuilders.idsQuery().addIds("395434","3532"));
    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  /*------------- 复合查询 --------------------*/
  // bool复合查询
  @Test
  void testBool() throws IOException{
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    // 准备条件
    /*-- 方式1  ----*/
    //        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    //        boolQueryBuilder.must(QueryBuilders.termQuery("city","北京"));
    //        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(500));
    //        // 准备DSL
    //        request.source().query(boolQueryBuilder);

    /*---- 方式2 ----*/
    request.source()
      .query(QueryBuilders.boolQuery()
             .must(QueryBuilders.termQuery("city","北京"))
             .filter(QueryBuilders.rangeQuery("price").lte(500)));
    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    show(response);
  }

  // 自定义分页方式
  @Test
  void testPageAndSort() throws IOException{
    int page = 1;   //页码
    int size = 5;   //步长
    String searchName="希尔顿"; // 查询条件
    // 准备请求
    SearchRequest request = new SearchRequest("hotels");
    if (searchName == null){
      request.source().query(QueryBuilders.matchAllQuery());
    }else {
      request.source().query(QueryBuilders.matchQuery("brand",searchName));
    }
    // 自定义分页
    request.source().from((page-1)*size).size(size);
    // 自定义排序
    request.source().sort("price", SortOrder.DESC);
    // 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 解析结果
    show(response);
  }
}

小结:

文档的查询操作实现步骤大致都相同:文章来源地址https://www.toymoban.com/news/detail-760041.html

  1. 准备请求
  2. 准备DSL
  3. 发送请求

到了这里,关于SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【开发】中间件——ElasticSearch

    ElasticSearch是一个基于Lucene的搜索服务器。提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口 ElasticSearch是一个基于Lucene的搜索服务器。提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口 ElasticSearch是用JAVA开发的。达到实时搜索,稳定可靠,快速,

    2024年02月17日
    浏览(51)
  • ES(Elasticsearch)中间件

    文章目录 配置连接ES 全文搜索引擎 全文搜索引擎就是通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户。 官网地址: 链接:

    2024年02月11日
    浏览(46)
  • Java中间件-Elasticsearch

    Elasticsearch 是一个非常强大的搜索引擎。它目前被广泛地使用于各个 IT 公司。Elasticsearch 是由 Elastic 公司创建。它的代码位于 GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine。目前,Elasticsearch 是一个免费及开放(free and open)的项目。同时,Elastic 公司也拥有

    2023年04月27日
    浏览(45)
  • 中间件: ElasticSearch的安装与部署

    文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 创建用户: 系统参数配置: 方式一:YUM安装 方式二: 配置 启动 (1)修改配置elasticsearch.yml: cluster.name # 一个集群内cluster name 需要相同 node.name # 各个节点node name 唯一 discovery.seed_hosts # network.host node.mast

    2024年02月12日
    浏览(39)
  • 关于中间件技术

        中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。     软件中间件的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户开发和集

    2024年02月06日
    浏览(38)
  • mysql代理、中间件技术

    名词 DB proxy 数据库中间件 功能 读写分离:读写分离导致处理速度迅速,一般情况下是主服务器进行写操作而从服务器进行读操作 负载均衡 支持数据的分片自动路由和聚合 本文主要围绕Mycat实现、且在完成MM-SS集群的条件下 1.配置五台虚拟机的域名解析(在之前完成的集群技

    2024年02月12日
    浏览(38)
  • 【消息中间件MQ系列】Spring整合kafka并设置多套kafka配置

            圣诞节的到来,程序员不会收到圣诞老人的🎁,但可以自己满足一下自己,所以,趁着有时间,就记录一下这会儿撸了些什么代码吧!!!         因为业务原因,需要在系统内新增其他的kakfa配置使用,所以今天研究的是怎么在系统内整合多套kafka配置使用。

    2024年02月01日
    浏览(93)
  • 【中间件】ElasticSearch:ES的基本概念与基本使用

    Index索引、Type类型,类似于数据库中的数据库和表,我们说,ES的数据存储在某个索引的某个类型中(某个数据库的某个表中),Document文档(JSON格式),相当于是数据库中内容的存储方式 MySQL:数据库、表、数据 ElasticSearch:索引、类型、文档 ElasticSearch的检索功能基于其倒

    2024年02月04日
    浏览(44)
  • Springcloud中间件-----分布式搜索引擎 Elasticsearch

    该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 预计看完跟着练习5小时足够 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如:

    2024年02月08日
    浏览(53)
  • RabbitMQ系列教程消息中间件技术精讲

    作者:禅与计算机程序设计艺术 消息中间件(Message Queue,MQ)是一种分布式应用间通信的组件。它可以在不同的系统之间传递消息、数据或指令。在现代IT架构中,越来越多的应用需要相互通信,所以出现了消息队列的概念。RabbitMQ是一个开源的AMQP实现,是一个可靠、可扩展

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包