ElasticSearch高级操作之导入数据

本文详细介绍了如何将数据库中的Goods表数据导入到Elasticsearch(ES)中,包括创建ES索引、查询数据库数据、使用Java批量添加数据到ES。通过MyBatis查询Goods表,然后使用BulkRequest进行批量索引操作,最终实现数据迁移。测试结果显示,数据导入成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入数据(后续ES索引表中的数据均来源于数据库中,所以需要将数据库中的数据查询出来后统一导入到ES库中)

需求:将数据库中的Goods表中的所有数据,导入到ElasticSearch中

实现步骤:

​ 1. 在ES创建一个Goods的的索引(相当于是数据库)

​ 2.查询Goods表数据(可以使用jdcb和mybatis)

​ 3.批量添加到ES中

环境准备

PUT goods
{
	"mappings": {
		"properties": {
			"title": {
				"type": "text",
				"analyzer": "ik_smart"
			},
			"price": { 
				"type": "double"
			},
			"createTime": {
				"type": "date"
			},
			"categoryName": {	
				"type": "keyword"
			},
			"brandName": {	
				"type": "keyword"
			},
	
			"spec": {		
				"type": "object"
			},
			"saleNum": {	
				"type": "integer"
			},
			
			"stock": {	
				"type": "integer"
			}
		}
	}
}



#查询
GET goods


#添加数据
POST goods/_doc/1
{
  "title":"小米手机",
  "price":1000,
  "createTime":"2019-12-01",
  "categoryName":"手机",
  "brandName":"小米",
  "saleNum":3000,
  "stock":10000,
  "spec":{
    "网络制式":"移动4G",
    "屏幕尺寸":"4.5"
  }
}

#查询全部

GET goods/_search

Java代码实现

导入相关的pom依赖坐标

 <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

数据源准备

elasticsearch:
  host: "192.168.23.128"
  port: 9200

# datasource
spring:
  datasource:
    url: jdbc:mysql:///es?serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver


# mybatis
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件路径
  type-aliases-package: com.itheima.domain

实体类准备

package com.itheima.domain;

import java.util.Date;
import java.util.Map;

public class Goods {

    private double id;
    private String title;
    private double price;
    private int stock;
    private int saleNum;
    private Date createTime;
    private String categoryName;
    private String brandName;
    private Map spec;       //字符串转为Map集合

    private String specStr;  //用来接收数据库中的json格式的字符串

    @Override
    public String toString() {
        return "Goods{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", price=" + price +
                ", stock=" + stock +
                ", saleNum=" + saleNum +
                ", createTime=" + createTime +
                ", categoryName='" + categoryName + '\'' +
                ", brandName='" + brandName + '\'' +
                ", spec=" + spec +
                ", specStr='" + specStr + '\'' +
                '}';
    }

    public double getId() {
        return id;
    }

    public void setId(double id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public int getSaleNum() {
        return saleNum;
    }

    public void setSaleNum(int saleNum) {
        this.saleNum = saleNum;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public Map getSpec() {
        return spec;
    }

    public void setSpec(Map spec) {
        this.spec = spec;
    }

    public String getSpecStr() {
        return specStr;
    }

    public void setSpecStr(String specStr) {
        this.specStr = specStr;
    }
}

映射接口

package com.itheima.mapper;

import com.itheima.domain.Goods;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface GoodsMapper {

    //查询所有
    List<Goods> findAll();

}

映射配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.GoodsMapper">


    <!--查询全部-->
    <select id="findAll" resultType="com.itheima.domain.Goods">

      select

      id,title,price,stock,saleNum,createTime,categoryName,brandName,spec as specStr

       from goods

    </select>

</mapper>

测试代码

@Test
    public void test02() throws IOException {

        //从mysql中查询出所有数据
        List<Goods> all = goodsMapper.findAll();

        for (Goods goods : all) {
            //System.out.println(goods);

        BulkRequest bulkRequest = new BulkRequest();
        IndexRequest indexRequest = new IndexRequest("goods");
            indexRequest.id(goods.getId()+"").source(JSON.toJSONString(goods), XContentType.JSON);
        bulkRequest.add(indexRequest);

        client.bulk(bulkRequest, RequestOptions.DEFAULT);

        }


    }

测试结果:测试成功

### 配置 Logstash 使用 JDBC 插件将 MySQL 数据导入 Elasticsearch Logstash 是一个开源的数据处理管道工具,能够从多个源接收数据、转换这些数据并将其发送到指定的目标存储中。为了实现通过 JDBC 将 MySQL数据导入Elasticsearch 中,可以按照以下方法完成。 #### 1. 安装 Logstash 和必要插件 首先需要安装 Logstash 并确保其正常运行。接着下载适用于 MySQL 的 JDBC 驱动程序,并将其放置在 Logstash 的 `lib` 文件夹下[^3]。 ```bash wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.26.tar.gz tar -zxvf mysql-connector-java-8.0.26.tar.gz cp mysql-connector-java-8.0.26/mysql-connector-java-8.0.26.jar /path/to/logstash/lib/ ``` #### 2. 创建 Logstash 配置文件 创建一个新的配置文件用于定义输入、过滤器和输出逻辑。以下是基于 JDBC 输入插件的一个示例配置: ```plaintext input { jdbc { jdbc_driver_library => "/path/to/logstash/lib/mysql-connector-java-8.0.26.jar" jdbc_driver_class => "com.mysql.cj.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/test" jdbc_user => "" jdbc_password => "" statement => "SELECT * FROM your_table_name" schedule => "* * * * *" # 每分钟执行一次查询 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "your_index_name" document_id => "%{id}" # 如果表中有唯一 ID 列,则可设置此字段作为文档 ID } } ``` 上述配置中的关键参数解释如下: - **`jdbc_driver_library`**: 指定 JDBC 驱动程序的位置。 - **`jdbc_driver_class`**: 设置驱动类名。 - **`jdbc_connection_string`**: 连接字符串指向目标数据库实例。 - **`statement`**: SQL 查询语句,可以根据需求自定义复杂查询[^2]。 - **`schedule`**: 可选定时调度功能,支持 Cron 表达式来控制轮询频率。 #### 3. 启动 Logstash 保存配置文件后,在命令行界面启动 Logstash 应用程序以加载该配置文件并开始传输过程。 ```bash ./bin/logstash -f /path/to/your_config_file.conf ``` 当 Logstash 成功连接至 MySQL 数据库并将记录写入 Elasticsearch 索引之后,可以通过 Kibana 或者直接访问 Elasticsearch API 来验证结果是否存在预期条目[^1]。 #### 4. 测试与优化 如果遇到性能瓶颈或者希望进一步提升效率,考虑采用分页机制减少单次请求负载大小;另外还可以启用索引模板预先设定映射规则从而改善检索体验。 ```json PUT _template/my_template { "index_patterns": ["your_index_name"], "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "field1": {"type": "text"}, "field2": {"type": "integer"} } } } ``` 以上展示了如何利用 Logstash 结合 JDBC 插件把关系型数据库里的资料迁移到分布式搜索引擎平台上的基本流程以及一些高级技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值