Golang 封装Elasticsearch

package tool

import (
   "context"
   "encoding/json"
   "fmt"
   "log"
   "os"
   "reflect"
   "strconv"
   "time"
   "gopkg.in/olivere/elastic.v6"
)


type EsClientType struct {
   EsCon *elastic.Client
}
var Timeout="10s" //超时时间
var EsClient EsClientType //连接类型


//var host = conf.GetEnv().EsearchServer  //这个是es服务地址,我的是配置到配置文件中了,测试的时候可以写死 比如 http://127.0.0.1:9200
/*cfgRes, err := ParseConfig("../etc/app.json")

if err != nil{
   panic(err.Error())
}
esConf := cfgRes.Es
fmt.Println(111111111111111111111111)
fmt.Println(esConf.Addr)
fmt.Println(222222222222222222222222)*/

var host = "http://192.168.10.245:9200"
//var host = "http://192.168.1.103:9200"

//下面定义的是 聚合时候用的一些参数

type Aggregations struct {
   AVG_Metric AVG_Metric `json:"AVG_Metric"`
}

type AVG_Metric struct {
   Buckets []Metric `json:"buckets"`
}

type Metric struct {
   Avg_time   Value `json:"avg_time"`
}

type Value struct {
   Value float64 `json:"value"`
}

func  init(){

   var err error
   elastic.SetSniff(false) //必须 关闭 Sniffing
   //es 配置

   //EsClient.EsCon, err = elastic.NewClient(elastic.SetURL(host))
   EsClient.EsCon, err =elastic.NewClient(
      elastic.SetURL(host),
      elastic.SetSniff(false),
      elastic.SetHealthcheckInterval(10*time.Second),
      elastic.SetGzip(true),
      elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
      elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)),
   )
   if err != nil {
      panic(err)
   }
   info, code, err := EsClient.EsCon.Ping(host).Do(context.Background())
   if err != nil {
      panic(err)
   }

   fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)

   esversion, err := EsClient.EsCon.ElasticsearchVersion(host)
   if err != nil {
      panic(err)
   }
   fmt.Printf("Elasticsearch version %s\n", esversion)
   fmt.Println("conn es succ",EsClient.EsCon)
}

func (client *EsClientType) PlanList(params map[string]interface{}) *elastic.SearchResult {
   var res *elastic.SearchResult
   var err error

   page := 1
   size := 10
   //if _, ok := params["size"]; ok {
   // page, _ = strconv.Atoi(params["page"])
   // size, _ = strconv.Atoi(params["size"])
   //}

   //条件
   //boolq := elastic.NewTermQuery("pk_course", Params["cid"])
   boolq:=elastic.NewBoolQuery()

   //查询条件
   if _, ok := params["pkPlan"]; ok {
      boolq.Must(elastic.NewMatchQuery("pk_plan",params["pkPlan"]))
   }

   if _, ok := params["cid"]; ok {
      boolq.Must(elastic.NewMatchQuery("fk_course", params["cid"]))
   }
   if _, ok := params["pkPlans"]; ok {
      //boolq.Must(elastic.NewTermsQuery("pk_plan", params["pkPlans"]))
      //"1890,1886"
      pkPlans := ToInterfaceSlice(params["pkPlans"])
      //boolq.Filter(elastic.NewTermsQuery("pk_plan", "1890","1886"))  //todo::查询多个排课IN 的写法
      boolq.Filter(elastic.NewTermsQuery("pk_plan", pkPlans...))  //todo::查询多个排课  IN 的写法
   }

   //boolq.Must(elastic.NewMatchQuery("max_user",50))
   //boolq.Filter(elastic.NewRangeQuery("fk_user").Gt(15))

   //打印查询语句
   q,_ := boolq.Source()
   PrintQuery(q)

   res,err = client.EsCon.Search("plan").
      Type("info").
      Query(boolq).
      Size(size).
      From((page-1)*size).
      Do(context.Background())

   if err != nil {
      println("排课中间层返回的错误是:"+err.Error())
      return nil
   }

   return res

}

func PrintQuery(src interface{}) {
   fmt.Println("*****")
   data, err := json.MarshalIndent(src, "", "  ")
   if err != nil {
      panic(err)
   }
   fmt.Printf("\n查询排课中间层执行的语句是: %v \n", string(data))
}


func ToInterfaceSlice(slice interface{}) []interface{} {
   s := reflect.ValueOf(slice)
   if s.Kind() != reflect.Slice {
      panic("InterfaceSlice() given a non-slice type")
   }

   ret := make([]interface{}, s.Len())

   for i:=0; i<s.Len(); i++ {
      ret[i] = s.Index(i).Interface()
   }

   return ret
}

更多精彩文章请访问:百考汇

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值