导入数据(后续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);
}
}
测试结果:测试成功