由于实验室项目用到go语言连接es,因此学习了一下。本篇讲述的是如何在es中建立index及其type。
//首先调用gopkg.in/olivere/elastic.v5包,这个包真的帮大忙了!这里使用的版本是第五版。
package main
import (
"context"
"fmt"
"log"
"os"
"time"
"gopkg.in/olivere/elastic.v5"
)
//声明客户端类型以及本地服务器IP及端口,这里一般自动绑定9200端口。
var client *elastic.Client
var host = "http://10.10.88.203:9200/"
//建立几个你想要的type,并转换为json格式。这里建立了三种type,内容包含int、string、uint64等型。
type IPinfo struct {
Port801 int `json:"port801"`
Port802 int `json:"port802"`
Port803 int `json:"port803"`
Port804 int `json:"port804"`
}
type Bidinfo struct {
Port80 int `json:"port80"`
Back1 string `json:"back1"`
Back2 string `json:"back2"`
Back3 string `json:"back3"`
}
type Loginfo struct {
TimeStamp uint64 `json:"time_stamp"`
TimeDelay int `json:"time_delay"`
MessageType int `json:"message_type"`
Error string `json:"error"`
Dir string `json:"dir"`
}
//将你想要建立的type类型进行数据输入,这里是测试数据所以随便设了一些值,最后返回IPinfo, Bidinfo, Loginfo三种struct,名字分别为e1、e2、e3。
func build_constructure() (IPinfo, Bidinfo, Loginfo) {
IPinfoVNumber := 100
BidinfoVNumber := 100
LoginfoVNumber := 100
stringinfoVNumber := "gyfiutfuhiygfutyrdutdkuthgjyrdytfjyrsytfjy"
var TimeStamp uint64 = 100000000
e1 := IPinfo{IPinfoVNumber,
IPinfoVNumber,
IPinfoVNumber,
IPinfoVNumber,
IPinfoVNumber}
e2 := Bidinfo{BidinfoVNumber,
BidinfoVNumber,
stringinfoVNumber,
stringinfoVNumber,
stringinfoVNumber}
e3 := Loginfo{TimeStamp,
LoginfoVNumber,
LoginfoVNumber,
stringinfoVNumber,
stringinfoVNumber}
return e1, e2, e3
}
//关键的函数,建立channel。
func create(end chan int) {
//设立节点数
workers := 10
bulk := 10000
//建立三个type
ipinfo, bidinfo, loginfo := build_constructure()
//建立一个新的客户端
client, err := elastic.NewClient()
if err != nil {
panic(err)
}
// 建立一个bulk processor(可以类比于一个数据库)
processor, err := client.BulkProcessor().Workers(workers).Stats(true).BulkActions(bulk).BulkSize(200 << 20).Do(context.Background())
if err != nil {
panic(err)
}
// 建立一个bulk index request
// 注意: 一定要建立index及type
req_ip := elastic.NewBulkIndexRequest().Index("bulk_processor").Type("ip").Doc(ipinfo)
req_bid := elastic.NewBulkIndexRequest().Index("bulk_processor").Type("bid").Doc(bidinfo)
req_log := elastic.NewBulkIndexRequest().Index("bulk_processor").Type("log").Doc(loginfo)
//将建立好的index放入processor
for {
processor.Add(req_ip)
processor.Add(req_bid)
processor.Add(req_log)
}
// Stop the bulk processor and do some cleanup
defer processor.Close()
end <- 0
//主函数,执行以上函数并计算建表时间
func main() {
//这里集群中有两个线程
threadnumber := 2
end := make(chan int)
start_time := time.Now()
fmt.Printf("Now Starting, at %s\n", start_time)
for i := 0; i < threadnumber; i++ {
go create(end)
}
for i := 0; i < threadnumber; i++ {
//读end管道
<-end
}
finish_time := time.Now()
fmt.Printf("Time consuming: %s\n", finish_time.Sub(start_time))
}
完成啦!