使用分页导入的方式把大量数据从mysql导入es

导读:本篇文章讲解 使用分页导入的方式把大量数据从mysql导入es,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、首先要有分页功能的代码 

如何使用mybatis-plus实现分页,可参考

http://t.csdn.cn/ddnlk

2、要创建feign远程调用模块

可以参考

http://t.csdn.cn/gshFw

3、在feign模块中声明远程调用接口

1.在feign模块中创建一个接口,名字可以是你要调用的服务名+client

使用分页导入的方式把大量数据从mysql导入es

 2.接口中的代码为要调用的方法,也就是分页方法

package com.hmall.config;

import com.hmall.common.dto.Item;
import com.hmall.common.dto.PageDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 商品模块的远程调用
 *
 * @author ning
 * @since 2022/12/9 18:39
 */
//表示对应的是itemservice服务器
@FeignClient("itemservice")
public interface ItemClient {

    //分页查询
    //Item为数据库的实体类,需要复制一份到Feign模块,
    //注意,复制过来的实体类,只需要属性和构造方法,其他的不需要,否则会报错
    @GetMapping("/item/list")
    public PageDTO<Item> list(@RequestParam("page") Integer page, @RequestParam("size") Integer size);
}

 实体类:

使用分页导入的方式把大量数据从mysql导入es

 4、在es对应的模块加入ItemClient依赖

例如:

使用分页导入的方式把大量数据从mysql导入es

 5、创建启动类

package com.hmall.search;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author ning
 * @since 2022/12/9 20:03
 */

//开启Feign客户端
//basePackages 指定需要扫描的包
@EnableFeignClients(basePackages = "com.hmall.client")
@SpringBootApplication
public class SearchApplication {

    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class, args);
    }
}

6、创建es索引库对应的实体类itemDoc

package com.hmall.search.pojo;

import com.hmall.common.dto.Item;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * es的实体类
 *
 * @author ning
 * @since 2022/12/9 20:12
 */

@NoArgsConstructor
@Data
public class ItemDoc {
    private Long id;//商品id
    private String name;//商品名称
    private Long price;//价格(分)
    private String image;//商品图片
    private String category;//分类名称
    private String brand;//品牌名称
    private Integer sold;//销量
    private Integer commentCount;//评论数
    private Boolean isAD;//商品状态 1-正常,2-下架
    private List<String> suggestion = new ArrayList<>(2);

    //把从数据查出来的参数复制到这个es的实体类
    public ItemDoc(Item item) {
        //复制属性
        BeanUtils.copyProperties(item,this);
        //自动补全字段
        //品牌
        suggestion.add(item.getBrand());
        //分类
        suggestion.add(item.getCategory());
    }
}

7、修改配置类(也可以不设置)

ribbon超时设置 (防止数据库读取时间长时,feign远程调用失败)

默认是3秒,查询如果超过3秒,就失败了

这是改成了5秒

ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000

8、编写数据导入的测试方法

import com.alibaba.fastjson.JSON;
import com.hmall.client.ItemClient;
import com.hmall.common.dto.Item;
import com.hmall.common.dto.PageDTO;
import com.hmall.search.pojo.ItemDoc;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.List;

/**
 * 使用分页把数据从mysql导入es
 *
 * @author ning
 * @since 2022/12/9 20:32
 */

@Slf4j
@SpringBootTest
public class FeignTest {

    //注入远程调用分页方法的接口
    @Autowired
    private ItemClient itemClient;

    //注入es的组件操作索引库的增删改查
    @Autowired
    private RestHighLevelClient client;


    /**
     * 测试:分页接口是否正常
     * 建议:在正式运行下边的数据导入的代码之前,先运行以下代码,确保远程调用分页接口正常
     */
    @Test
    void testItemClient() {
        PageDTO<Item> pageDTO = itemClient.list(1, 5);
        List<Item> itemList = pageDTO.getList();
        Long total = pageDTO.getTotal();
        log.info("total:::" + total);
        for (Item item : itemList) {
            System.out.println(item);
        }
    }

    
    /**
     * 数据导入(从mysql导入es)
     */
    @Test
    void testDataSync() {
        //使用分页查询数据库
        //(当前页和每页显示几条数据可以随便写,目的是获取总记录数)
        PageDTO<Item> pageDTO = itemClient.list(1, 1);
        //获取总记录数
        Long total = pageDTO.getTotal();
        System.out.println("total:" + total);
        //设置每页有1000条数据
        int size = 1000;
        //计算页数
        //总记录数和1000做模运算,如果为0,总页数就是total / size的值,否则就是total / size + 1
        Long page = total % size == 0 ? total / size : total / size + 1;
        //根据页数循环,把每一页的数据复制到es
        for (int i = 1; i <= page; i++) {
            //使用分页方法获取每页的数据
            pageDTO = itemClient.list(i, size);
            //创建一个批量请求
            BulkRequest bulkRequest = new BulkRequest();
            for (Item item : pageDTO.getList()) {
                //判断商品的状态,只有是可售卖的状态才可以复制到es
                if (item.getStatus() == 1) {
                    //创建es的实体类对象,并赋值数据库查出当页数据赋值
                    ItemDoc itemDoc = new ItemDoc(item);
                    //把封装之后的es的实体类对象转成json格式
                    String jsonString = JSON.toJSONString(itemDoc);
                    //System.out.println(itemDoc.getId());
                    //生成添加文档的请求
                    bulkRequest.add(                    //并把添加文档的请求存入批量请求中
                            new IndexRequest("item")    //创建一个添加文档的请求对象,item为添加到哪个索引库
                                    .id(itemDoc.getId().toString())//新添加数据的id
                                    .source(jsonString, XContentType.JSON)//添加的数据,声明数据格式是json
                    );
                }
            }
            try {
                //发送请求
                //第一个参数:创建的请求,第二个参数:是否还有其他执行的选项,一般选DEFAULT
                client.bulk(bulkRequest, RequestOptions.DEFAULT);
                System.out.printf("第%d页,本页总条数:%d,导入完毕\r\n", i, pageDTO.getList().size());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

我出现的问题:

以上步骤执行完毕之后,我的代码报了一个错:

使用分页导入的方式把大量数据从mysql导入es

 使用分页导入的方式把大量数据从mysql导入es

 意思是,拒绝连接:没有进一步的信息

我的解决方案是:在yml文件中配置以下信息,问题就可以解决

spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
    # 异常处理
  elasticsearch:
    rest:
      uris: 192.168.177.132:9200

但是,我水品有限,没有明白什么原因,还有这个配置文件中的内容也不是很清楚,如果有路过的大佬,原因耽误宝贵的时间,给小弟解释一下,小弟不胜感激!!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/65849.html

(0)
小半的头像小半
0 0

相关推荐

  • final修饰类 Java

    final修饰类

    0 080
    小半的头像 小半
    2022年5月22日
  • Spring学习(一)——Spring认识及IOC理论 后端开发

    Spring学习(一)——Spring认识及IOC理论

    0 0170
    飞熊的头像 飞熊
    2023年7月26日
  • 机器学习常见算法分类 Java

    机器学习常见算法分类

    0 0237
    小半的头像 小半
    2022年5月24日
  • 第 4 章 程序的控制结构 后端开发

    第 4 章 程序的控制结构

    0 0109
    小半的头像 小半
    2022年5月13日
  • 【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法 后端开发

    【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

    0 0150
    飞熊的头像 飞熊
    2023年7月27日
  • 数据库常见锁详解,加锁查询,通用方式 后端开发

    数据库常见锁详解,加锁查询,通用方式

    0 0140
    飞熊的头像 飞熊
    2024年1月12日
  • 海康大华ie插件开发 后端开发

    海康大华ie插件开发

    0 086
    小半的头像 小半
    2022年5月31日
  • Java-Iterator迭代器与foreach循环 后端开发

    Java-Iterator迭代器与foreach循环

    0 0257
    飞熊的头像 飞熊
    2023年6月19日
  • 02 微架构教务系统——课程搜索接口 后端开发

    02 微架构教务系统——课程搜索接口

    0 0101
    小半的头像 小半
    2022年5月19日
  • 最短路径(Floyd算法) Python

    最短路径(Floyd算法)

    0 0129
    seven_的头像 seven_
    2023年2月21日
  • 开源社区的一大胜利:政府机构 5000 万台电脑将替换为国产 Linux! 后端开发

    开源社区的一大胜利:政府机构 5000 万台电脑将替换为国产 Linux!

    0 0114
    小半的头像 小半
    2022年10月6日
  • JVM堆外内存 Java

    JVM堆外内存

    0 0147
    小半的头像 小半
    2022年5月24日

站长精选

  • 业务优雅解耦,一文带你吃透 Spring 框架中的事件处理机制

    业务优雅解耦,一文带你吃透 Spring 框架中的事件处理机制

    2024年2月19日

  • 别总写代码,这130个网站比涨工资都重要!

    别总写代码,这130个网站比涨工资都重要!

    2023年1月28日

  • SpringBoot 动态加载jar包,动态配置

    SpringBoot 动态加载jar包,动态配置

    2024年2月7日

  • 一行代码搞定 HTTP 请求,强得离谱~

    一行代码搞定 HTTP 请求,强得离谱~

    2023年5月5日

  • GPT-4 Copilot X震撼来袭!AI写代码效率10倍提升,动嘴写代码不再是梦!

    GPT-4 Copilot X震撼来袭!AI写代码效率10倍提升,动嘴写代码不再是梦!

    2023年3月26日

  • 4.6k Star,SpringBoot+Vue+App+硬件实现的智能家居系统,一套带走!

    4.6k Star,SpringBoot+Vue+App+硬件实现的智能家居系统,一套带走!

    2023年4月25日

  • Spring Cloud 中 7 种负载均衡策略!

    Spring Cloud 中 7 种负载均衡策略!

    2023年2月15日

  • 一个支持多存储的文件列表程序,开箱即用!

    一个支持多存储的文件列表程序,开箱即用!

    2023年11月7日

  • SpringBoot 使用线程池如何控制主线程和子线程的事务

    SpringBoot 使用线程池如何控制主线程和子线程的事务

    2023年2月8日

  • 手把手教你如何写一份糟糕透顶的简历

    手把手教你如何写一份糟糕透顶的简历

    2023年4月27日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

深圳SEO优化公司东莞网络营销东莞网站搭建大浪网站优化塘坑关键词排名包年推广布吉百度标王南山网站推广石岩外贸网站建设吉祥网站改版光明网站优化排名光明优秀网站设计大运网站推广光明至尊标王横岗企业网站设计坂田如何制作网站横岗关键词按天扣费横岗外贸网站建设坪山阿里店铺托管双龙百度网站优化排名松岗网站改版宝安网站推广方案布吉seo网站优化丹竹头网络推广龙岗网站关键词优化坪山网络营销福永网站改版松岗关键词按天计费木棉湾设计公司网站同乐推广网站深圳网站优化按天收费龙华网站优化排名歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化