golang elasticSearch 新建mapping(使用包 olivere/elastic)

Golang · Fecmall · 于 6年前 发布 · 11767 次阅读

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"}
            }
        }
	}`
    
}
共收到 6 条回复
blank#15年前 0 个赞

LZ:你好,我想请教下你使用这个包,怎么操作精确查询?

Fecmall#25年前 0 个赞

只能手机回复,等会去帮你找找吧

blank#35年前 0 个赞

@Fecshop #2楼 我能加你QQ好友,一起讨论点关于这个包操作ES的问题吗? 我的Q是419513210

Fecmall#45年前 0 个赞

等中旬回去安稳下来,给你找找代码

miyaye#55年前 0 个赞

elasticsearch 支持多个表查询吗

dakoo#65年前 0 个赞

@miyaye #5楼 elasticSearch 是没有表的概念的,习惯吧es的index说成数据库,把type理解成table,这是不对的

es没有表的概念,详细您去查阅文档把

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics