golang 和elastic的连接,使用了包:https://github.com/olivere/elastic
elasticSearch需要新建mapping,我使用的是es6
package esdb
import (
"context"
// "encoding/json"
"log"
// "reflect"
// "time"
"sync"
"errors"
"github.com/olivere/elastic"
)
var once sync.Once
var esClient *(elastic.Client)
var esUrl string = "http://127.0.0.1:9200"
func Client() (*(elastic.Client), error){
var err error
once.Do(func() {
// Starting with elastic.v5, you must pass a context to execute each service
ctx := context.Background()
// Obtain a client and connect to the default Elasticsearch installation
// on 127.0.0.1:9200. Of course you can configure your client to connect
// to other hosts and configure it in various other ways.
/*
client, err := elastic.NewClient(
elastic.SetURL("http://127.0.0.1:9200", "http://127.0.0.1:9201"),
elastic.SetBasicAuth("user", "secret"))
*/
esClient, err = elastic.NewClient(elastic.SetURL(esUrl))
if err != nil {
return
}
// Ping the Elasticsearch server to get e.g. the version number
info, code, err := esClient.Ping(esUrl).Do(ctx)
if err != nil {
return
}
log.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
// Getting the ES version number is quite common, so there's a shortcut
esversion, err := esClient.ElasticsearchVersion(esUrl)
if err != nil {
return
}
log.Printf("Elasticsearch version %s\n", esversion)
})
return esClient, err
}
// 创建 elasticSearch 的 Mapping
func InitMapping(esIndexName string, esTypeName string, typeMapping string) error{
var err error
indexMapping := helper.GetEsIndexMapping()
ctx := context.Background()
client, err := Client()
if err != nil {
return err
}
// Use the IndexExists service to check if a specified index exists.
exists, err := client.IndexExists(esIndexName).Do(ctx)
if err != nil {
log.Println("IndexExists" + err.Error())
return err
}
//log.Println("es index: " + esIndexName)
//log.Println("es type: " + esTypeName)
//log.Println("es index mapping: " + indexMapping)
//log.Println("es type mapping: " + typeMapping)
if !exists {
log.Println("es index not exists: " + esIndexName)
// Create a new index.
createIndex, err := client.CreateIndex(esIndexName).Body(indexMapping).Do(ctx)
if err != nil {
log.Println("CreateIndex" + err.Error())
return err
}
if !createIndex.Acknowledged {
// Not acknowledged
return errors.New("create index:" + esIndexName + ", not Ack nowledged")
}
}
/**
* 判断 type 是否存在
exists, err = client.TypeExists().Index(esIndexName).Type(esTypeName).Do(ctx)
if err != nil {
return err
}
if !exists {
}
*/
// PutMapping() *IndicesPutMappingService
putresp, err := client.PutMapping().Index(esIndexName).Type(esTypeName).BodyString(typeMapping).Do(context.TODO())
// 新建 mapping
//indicesCreateResult, err := elastic.NewIndicesCreateService(client).Index(esIndexName).BodyString(mapping).Do(ctx)
if err != nil {
log.Println("NewIndicesCreateService" + err.Error())
return err
}
if !putresp.Acknowledged {
// Not acknowledged
return errors.New("create mapping fail, esIndexName:" + esIndexName + ", esTypeName:" + esTypeName + ", not Ack nowledged")
}
// 插入数据
/*
type WholeBrowserData struct {
BrowserId string `json:"browser_id"`
BrowserName string `json:"browser_name"`
}
// Index a tweet (using JSON serialization)
wholeBrowserData := WholeBrowserData{BrowserId: "BrowserId", BrowserName: "BrowserName" }
put1, err := client.Index().
Index(esIndexName).
Type(esTypeName).
Id("1").
BodyJson(wholeBrowserData).
Do(ctx)
if err != nil {
// Handle error
panic(err)
}
log.Printf("Indexed tweet %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type)
*/
return err
}
调用:
// esIndexName
esWholeBrowserTypeName := helper.GetEsWholeBrowserTypeName()
esWholeBrowserTypeMapping := helper.GetEsWholeBrowserTypeMapping()
// 删除index
err =esdb.DeleteIndex(esIndexName)
if err != nil {
return err
}
// 初始化mapping
err = esdb.InitMapping(esIndexName, esWholeBrowserTypeName, esWholeBrowserTypeMapping)
if err != nil {
return err
}
helper包
// Whole Browser Type Name
func GetEsWholeBrowserTypeName() (string){
return "whole_browser_data"
}
// Whole Browser Type Mapping
// https://github.com/olivere/elastic/issues/755
func GetEsWholeBrowserTypeMapping() (string){
return `{
"whole_browser_data":{
"properties":{
"browser_id": {"type":"keyword"},
"browser_name": {"type":"keyword"},
"pv": {"type":"integer"},
"uv": {"type":"integer"},
"jump_out_count": {"type":"integer"},
"drop_out_count": {"type":"integer"},
"stay_seconds": {"type":"integer"},
"is_return": {"type":"integer"},
"first_page": {"type":"integer"},
"service_date_str": {"type":"date"},
"stay_seconds_rate":{"type":"float"},
"jump_out_rate": {"type":"float"},
"drop_out_rate": {"type":"float"},
"is_return_rate": {"type":"float"},
"pv_rate": {"type":"float"},
"sku_sale_rate": {"type":"float"},
"cart_count": {"type":"integer"},
"order_count": {"type":"integer"},
"success_order_count": {"type":"integer"},
"success_order_no_count": {"type":"integer"}
}
}
}`
}