Go操作elasticsearch合集

安装ES集群(Liunx版本)

参考链接这个博主的很不错

连接客户端

案例

// 连接Es
func connectEs() (*elastic.Client, error) {
   
	return elastic.NewClient(
		// 设置Elastic服务地址
		elastic.SetURL("http://192.168.6.39:9201"),
		// 允许指定弹性是否应该定期检查集群,默认为true,会把请求http://ip:port/_nodes/http,
		// 并将其返回的publish_address作为请求路径
		//elastic.SetSniff(true),
		// 心跳检查,间隔时间
		elastic.SetHealthcheckInterval(time.Second*5),
		// 设置错误日志
		elastic.SetErrorLog(log.New(os.Stderr, "ES-ERROR ", log.LstdFlags)),
		// 设置info日志
		elastic.SetInfoLog(log.New(os.Stdout, "ES-INFO ", log.LstdFlags)),
	)
}

简单的一些查看操作

func TestBeego(t *testing.T) {
   
	client, err := connectEs()
	if err != nil {
   
		t.Error(err)
		return
	}
	// 健康检查
	Health, _ := client.ClusterHealth().Index().Do(context.TODO())
	// 查看索引
	Indexs, _ := client.CatIndices().Do(context.TODO())
	// 模糊查询某个索引
	Index, _ := client.CatIndices().Index(".apm*").Do(context.TODO())
	// 查看所有分片
	Nodes, _ := client.CatAllocation().Do(context.TODO())
	// 查看谁是主分片
	MasterNode, _ := client.CatMaster().Do(context.TODO())
	fmt.Println("健康检查: ", Health)
	fmt.Println("索引: ", Indexs)
	fmt.Println("查看所有分片: ", Nodes)
	fmt.Println("查看谁是主分片: ", MasterNode)
	fmt.Println("模糊查看索引 : ", Index)

}

索引基础操作CRUD

创建索引

const indexName = "user_test"

// 创建索引 (自己指定mapping)
func TestCreateIndexMapping(t *testing.T) {
   
	userMapping := `{
    "mappings":{
        "properties":{
            "name":{
                "type":"keyword"
            },
            "age":{
                "type":"byte"
            },
            "birth":{
                "type":"date"
            }
        }
    }
}`
	// 获取客户端
	client, _ := connectEs()
	// 检索当前有没有该索引

	exist, err := client.IndexExists(indexName).Do(context.Background())
	if err != nil {
   
		t.Errorf("检测索引失败:%s", err)
		return
	}
	if exist {
   
		t.Error("索引已经存在,无需重复创建!")
		return
	}
	// 不存在就创建
	//	如果想直接创建索引,只需删除BodyString(userMapping)
	res, err := client.CreateIndex(indexName).BodyString(userMapping).Do(context.Background())
	if err != nil {
   
		t.Errorf("创建索引失败:%s", err)
		return
	}
	fmt.Println("创建成功: ", res)
}

添加数据(单条数据)

/ 添加数据(单条添加)
type UserInfo struct {
   
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Birth string `json:"birth"`
}

func TestAddOne(t *testing.T) {
   
	client, _ := connectEs()
	// 创建userInfo
	userInfo := UserInfo{
   
		Age:   18,
		Name:  "冯消水",
		Birth: "2000-01-15",
	}
	// 这里可以选择指定或者不指定 Id 不指定ID 就会用默认的
	response, err := client.Index().Index(indexName).Id("1").BodyJson(userInfo).Do(context.Background())
	if err != nil {
   
		t.Errorf("添加失败:%s", err)
	}
	fmt.Println("添加成功", response)
}

在这里插入图片描述

批量添加

// 批量添加
func TestBatchAdd(t *testing.T) {
   
	client, _ := connectEs()
	userMap := make(map[string]string)
	userMap["fjj"] = "2000-01-02"
	userMap["mjd"] = "2000-02-02"
	userMap["liu"] = "2000-03-02"
	userMap["admin"] = "2000-04-02"
	rand.Seed(time.Now().Unix())
	// 创建bulk
	bulkService := client.Bulk().Index(indexName)
	id := 2
	for name, birth := range userMap {
   
		userinfos := UserInfo{
   
			Age:   rand.Intn(50),
			Name:  name,
			Birth: birth,
		}
		// 批量添加
		doc := elastic.NewBulkCreateRequest().Id(strconv.Itoa(id)).Doc(userinfos)
		bulkService.Add(doc)
		id++
	}
	// 检查添加的数据是否为空
	if bulkService.NumberOfActions() < 1 {
   
		t.Error("被添加的数据不能为空!")
		return
	}
	// 保存
	response, err := bulkService.Do(context.Background())
	if err != nil {
   
		t.Errorf("保存失败:%s", err)
		return
	}
	fmt.Println("保存成功: ", response)
}

通过id 修改数据


// 修改数据(script) 根据id更新
func TestUpdateOneByScript(t *testing.T) {
   
	client, _ := connectEs()
	// 通过id 修改
	updateResponse, err := client.Update().Index(indexName).Id("1").Script(elastic.NewScript("ctx._source.birth='2099-12-31'")).Do(context.Background())
	if err != nil {
   
		t.Errorf("根据ID更新单条记录失败:%s", err)
		return
	}
	fmt.Println("根据ID更新成功:", updateResponse.Result)
}

根据条件更新

// 根据条件更新
func TestUpdate(t *testing.T) {
   
	client, _ := connectEs()
	res, err := client.UpdateByQuery(indexName).Query(elastic.NewTermQuery("name", "mjd"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值