Go & ES7.4速学:用 Golang 导入商品数据
Golang 347 字
在导入数据之前,我这里准备了一个book 表,在表中存储了一万条数据。
select * from books limit 1 \G;
*************************** 1. row ***************************
book_id: 220
book_name: Java项目实战教程+Java程序设计与项目实训教程
book_intr:
book_price1: 72.00
book_price2: 72.50
book_author: 姜华刘闯
book_press: 清华大学出版社
book_date: 2012-09-01
book_kind_str: PHP
book_kind: 2
dd_id: 1328395676
1 row in set (0.001 sec)
我们现在想办法,将这些数据导入到 es 中,在这里我们是用 grom 来完成数据的读取,我们先导入 50 条数据。导入数据 之前我们应该先创建 mapping。
先简单说一下 key 和 keyword 的区别,如果需要全文检索那么就用 text ,如果是要精准匹配那么就使用 keyword。
在上一节中我们说过id 这个属性,一般来说我们可以灌入自己的id,不适用 es 自动生成,要不然取数据的时候会比较麻烦。
插入数据的步骤
利用 grom 获取数据
定义db 工具类
package db
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
)
var db *gorm.DB
func init() {
var err error
db, err = gorm.Open("mysql",
"root:123123@tcp(localhost:3306)/books?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
db.SingularTable(true)
db.DB().SetMaxIdleConns(5)
db.DB().SetMaxOpenConns(10)
}
func GetDB() *gorm.DB {
return db
}
定义 model
package model
type Books struct {
BookID int `gorm:"column:book_id;AUTO_INCREMENT;PRIMARY_KEY"`
BookName string `gorm:"column:book_name;type:varchar(50)"`
BookIntr string `gorm:"column:book_intr;type:text"`
BookPrice1 float64 `gorm:"column:book_price1;type:decimal"`
BookPrice2 float64 `gorm:"column:book_price2;type:decimal"`
BookAuthor string `gorm:"column:book_author;type:varchar(50)"`
BookPress string `gorm:"column:book_press;type:varchar(50)"`
BookDate string `gorm:"column:book_date;type:varchar(50)"`
BookKind int `gorm:"column:book_kind;type:int"`
}
type BookList []*Books
获取数据
package main
import (
"es/db"
"es/model"
"fmt"
)
func main() {
page := 1
pageSize := 50
for {
bookList := model.BookList{}
dbConn := db.GetDB().Order("book_id desc").Limit(pageSize).Offset((page - 1) * page).Find(&bookList)
if dbConn.Error != nil || len(bookList) == 0 {
break
}
fmt.Println(bookList[1])
break
}
}
#
# &{19551 C语言程序设计教程(第2版) 导语_点评_推荐词 27.2 32 湘潭大学出版社 8}
在 main 函数中我们用分页的方式获取数据,每一次获取 50 条。
es 插入数据
我们先将 esclient 抽出一个单独的包。
package es
import (
"github.com/olivere/elastic/v7"
)
func GetEsClient() (*elastic.Client, error) {
client, err := elastic.NewClient(
elastic.SetURL("http://192.168.124.16:9200/"),
elastic.SetSniff(false),
)
if err != nil {
return nil, err
}
return client, nil
}
在之前插入我们使用的是写死的 json 字符串,在这里我们使用模型。
package main
import (
"context"
"es/db"
"es/es"
"es/model"
"fmt"
"log"
"strconv"
)
func main() {
page := 1
pageSize := 50
client, err := es.GetEsClient()
if err != nil {
log.Fatal(err)
}
for {
bookList := model.BookList{}
dbConn := db.GetDB().Order("book_id desc").Limit(pageSize).Offset((page - 1) * page).Find(&bookList)
if dbConn.Error != nil || len(bookList) == 0 {
break
}
fmt.Println(bookList[1])
for _, book := range bookList {
resp, err := client.Index().Index("books").Id(strconv.Itoa(book.BookID)).BodyJson(book).Do(context.Background())
if err != nil {
fmt.Println(err)
} else {
fmt.Println(resp)
}
}
break
}
}
接下来我们执行代码,后查看统计:
curl http://192.168.124.16:9200/books/_count
{"count":50,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
我们可以看到在 es 中已经有 50 条数据了。
$ curl http://192.168.124.16:9200/books/_search | python -m json.tool
{
"_shards": {
"failed": 0,
"skipped": 0,
"successful": 1,
"total": 1
},
"hits": {
"hits": [
{
"_id": "19552",
"_index": "books",
"_score": 1.0,
"_source": {
"BookAuthor": "\u848b\u6e05\u660e",
"BookDate": " 2008-10-01",
"BookID": 19552,
"BookIntr": "\u5bfc\u8bed_\u70b9\u8bc4_\u63a8\u8350\u8bcd",
"BookKind": 8,
"BookName": " C\u8bed\u8a00\u7a0b\u5e8f\u8bbe\u8ba1\u5b9e\u9a8c\u6307\u5bfc\u4e0e\u4e60\u9898\u89e3\u7b54",
"BookPress": "\u4eba\u6c11\u90ae\u7535\u51fa\u7248\u793e",
"BookPrice1": 19,
"BookPrice2": 19
},
"_type": "_doc"
},
....
}
/books/_search
如果没有接参数的话会默认显示 10 条数据。