1.介绍

ElasticSearch是一个分布式、可扩展、近实时的高性能搜索与数据分析引擎。在Go中经常使用的包有以下两个:

包 文档 Star 数量
olivere/elastic https://olivere.github.io/elastic/ 5.7k
elastic/go-elasticsearch https://github.com/elastic/go-elasticsearch 3.2k

2.安装

使用olivere/elastic

1
2
# 安装v7的版本
go get github.com/olivere/elastic/v7

3.配置

3.1 编写配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
elastic:
  # 是否开启
  enable: true
  # 服务地址,多个地址用逗号隔开
  url: http://127.0.0.1:9200
  # 是否转换请求地址,默认为true,当等于true时 请求http://ip:port/_nodes/http,将其返回的url作为请求路径
  sniff: false
  # 心跳检测间隔
  healthCheckInterval: 5s
  # 日志前缀
  logPre: ES-

3.2 编写配置结构体

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/**
 * elastic
 * @Description: ES配置
 **/
type elastic struct {
	Enable              bool          `yaml:"enable"`              // 是否开启
	Url                 string        `yaml:"url"`                 // 服务地址,多个地址用逗号隔开
	Sniff               bool          `yaml:"sniff"`               // 是否转换请求地址,默认为true,当等于true时 请求http://ip:port/_nodes/http,将其返回的url作为请求路径
	HealthCheckInterval time.Duration `yaml:"healthCheckInterval"` // 心跳检测间隔
	LogPre              string        `yaml:"logPre"`              // 日志前缀
}

3.3 加载配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 启动加载
func SetLoadInit() {
	// 初始化全局配置文件
	initConfig()
	// 初始化zap日志
	initLogger()
	// 初始化gorm
	initGorm()
	// 初始化redis
	initRedis()
	// 初始化es
	initElastic()
	// 定时任务
	initCron()
}

4.初始化ES客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// 创建es客户端
func initElastic() {
	// 配置
	elasticConfig := global.GvaConfig.Elastic
	if elasticConfig.Enable {
		fmt.Printf("elasticConfig: %v\n", elasticConfig)
		// 创建客户端
		client, err := elastic.NewClient(
			elastic.SetURL(elasticConfig.Url),
			elastic.SetSniff(elasticConfig.Sniff),
			elastic.SetHealthcheckInterval(elasticConfig.HealthCheckInterval),
			elastic.SetErrorLog(log.New(os.Stderr, elasticConfig.LogPre+"ERROR ", log.LstdFlags)),
			elastic.SetInfoLog(log.New(os.Stderr, elasticConfig.LogPre+"INFO ", log.LstdFlags)),
		)
		if err != nil {
			panic("创建ES客户端错误:" + err.Error())
		}
		global.GvaElastic = client
	}
}

5.使用

5.1 创建索引

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// CreateIndex 创建索引
func CreateIndex(ctx *gin.Context) {
	userMapping := `{
    "mappings":{
        "properties":{
            "name":{
                "type":"keyword"
            },
            "age":{
                "type":"byte"
            },
            "birth":{
                "type":"date"
            }
        }
    }
}`
	// 判断索引是否存在
	exist, _ := global.GvaElastic.IndexExists(indexName).Do(ctx)
	if exist {
		response.Error(ctx, "索引已经存在,无需重复创建!")
		return
	}
	res, err := global.GvaElastic.CreateIndex(indexName).BodyString(userMapping).Do(ctx)
	if err != nil {
		response.Error(ctx, "创建索引失败,无需重复创建!")
		return
	}
	response.OkWithData(ctx, res)
}

5.2 查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// SearchById 查询
func SearchById(ctx *gin.Context) {
	id, _ := ctx.GetQuery("id")
	res, err := global.GvaElastic.Get().Index(indexName).Id(id).Do(ctx)
	if err != nil {
		response.Error(ctx, fmt.Sprintf("查询失败:%s", err))
		return
	}
	response.OkWithData(ctx, res.Source)
}