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。

Untitled

先简单说一下 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 条数据。

maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见