ElasticSearch高级操作之导入数据

导入数据(后续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);

        }


    }

测试结果:测试成功

Guess you like

Origin blog.csdn.net/zhangzengxiu/article/details/112726686