1. 首先,我定义了一个全局变量ESClient作为ES客户端的单例,并在启动初调用Init函数初始化它 ```go var hostlist []string{ “http://ip1:9200/“, “http://ip2:9200/“, “http://ip3:9200/“ }

    var ESClient *elastic.Client

    func InitEs() { var err error // 创建es连接,如果通过nat地址访问,为防止地址被自动转换,可加elastic.SetSniff(false) ESClient, err = elastic.NewClient(elastic.SetURL(hostlist…)) if err != nil { logs.Error(err) os.Exit(1) } for _, v := range hostlist { // 尝试请求es info, code, err := ESClient.Ping(v).Do(context.Background()) if err != nil { logs.Error(err) os.Exit(1) } logs.Info(“Elasticsearch Node %s returned with code %d and version %s\n”, v, code, info.Version.Number) esversion, err := ESClient.ElasticsearchVersion(v) logs.Info(“Elasticsearch Node %s version %s\n”, v, esversion) } }

    1. 2. 然后定义了一个查询入参,将查询字段的json与参数类型定义出来
    2. ```go
    3. // 查询入参
    4. type EventParam struct {
    5. User string `json:"username"`
    6. Type string `json:"logtype"`
    7. Message string `json:"logmessage"`
    8. Time int64 `json:"logtime"`
    9. }
    1. 最后编写Search方法来进行查询
      1. func Search(req *EventParam, start,end,page, size int) ([]*eventti.EventParam, int, error) {
      2. // 定义分页
      3. if page < 1 {
      4. page = 1
      5. }
      6. if size < 0 {
      7. size = 10000
      8. }
      9. // 定义搜索的query
      10. boolQuery := elastic.NewBoolQuery()
      11. if req.User != "" {
      12. boolQuery.Filter(elastic.NewMatchQuery("username", strings.ToLower(req.User)))
      13. }
      14. if req.Type != "" {
      15. boolQuery.Filter(elastic.NewMatchQuery("logtype", req.Type))
      16. }
      17. if req.Message != "" {
      18. boolQuery.Filter(elastic.NewMatchPhraseQuery("logmessage", req.Message))
      19. }
      20. // 定义查询时间范围
      21. if req.Start != 0 && req.End != 0 {
      22. boolQuery.Filter(elastic.NewRangeQuery("logtime").Gte(start), elastic.NewRangeQuery("logtime").Lte(end))
      23. }
      24. // 执行搜索
      25. res, _ := models.ESClient.Search().Index("eventti-*").Type("doc").Query(boolQuery).Size(size).From((page - 1) * size).Do(context.Background())
      26. var typ EventParam
      27. resitemlist := make([]*eventti.EventParam, 0)
      28. //从搜索结果中取数据,只会取EventParam定义的字段
      29. for _, item := range res.Each(reflect.TypeOf(typ)) {
      30. if t, ok := item.(EventParam); ok {
      31. tmp := eventti.EventSearchResItem{
      32. User: t.User,
      33. Message: t.Message,
      34. Time: strconv.FormatInt(t.Time, 10),
      35. Type: t.Type,
      36. }
      37. resitemlist = append(resitemlist, &tmp)
      38. }
      39. }
      40. return resitemlist, len(resitemlist), nil
      41. }