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 }
更多精彩文章请访问:百考汇