Go操作elasticsearch合集

这篇具有很好参考价值的文章主要介绍了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)
}

go操作elasticsearch,个人笔记,elasticsearch,golang,大数据

批量添加

// 批量添加
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")).Script(elastic.NewScript("ctx._source.birth='2099-12-31'")).ProceedOnVersionConflict().Do(context.Background())
	if err != nil {
		t.Errorf("根据条件更新单条记录失败:%s", err)
		return
	}
	fmt.Println("根据条件更新成功:", res.Updated)
}

多字段更新

// 多字段更新
func TestUpdateByDoc(t *testing.T) {
	client, _ := connectEs()
	response, err := client.Update().Index(indexName).Id("2").Doc(map[string]interface{}{
		"name": "mjd2", "age": 39,
	}).Do(context.Background())
	if err != nil {
		t.Errorf("更新记录失败:%s", err)
		return
	}
	fmt.Println("根据条件更新成功:", response.Result)
}

批量更新

func TestBatchUpdate(t *testing.T) {
	client, _ := connectEs()
	bulkService := client.Bulk().Index(indexName)
	for _, id := range []string{"1", "2", "3", "4", "5"} {
		doc := elastic.NewBulkUpdateRequest().Id(id).Doc(map[string]interface{}{"age": 18})
		bulkService.Add(doc)
	}
	// 被更新的数量不能小于0
	if bulkService.NumberOfActions() < 0 {
		t.Error("被更新的数量不能为空")
		return
	}
	// 执行操作
	do, err := bulkService.Do(context.Background())
	if err != nil {
		t.Errorf("批量更新失败:%v", err)
		return
	}
	fmt.Println("更新成功:", do.Updated())
}

删除

// 通过Id 删除
func TestDelById(t *testing.T) {
	client, _ := connectEs()
	response, err := client.Delete().Index(indexName).Id("cxDhC4YBndr2knWC-YJt").Do(context.Background())
	if err != nil {
		t.Errorf("删除失败:%s", err)
		return
	}
	fmt.Println("删除成功: ", response.Result)
}

根据条件删除

// 根据条件删除
func TestDelByWhere(t *testing.T) {
	client, _ := connectEs()
	scrollResponse, err := client.DeleteByQuery(indexName).Query(elastic.NewTermQuery("name", "mjd")).ProceedOnVersionConflict().Do(context.Background())
	if err != nil {
		t.Errorf("删除失败:%s", err)
		return
	}
	fmt.Println("删除成功: ", scrollResponse.Deleted)
}

索引简单查询及其花式查询

单条查询

// 单条查询
func TestSearchOneEs(t *testing.T) {
	client, _ := connectEs()
	getResult, err := client.Get().Index(indexName).Id("1").Do(context.Background())
	if err != nil {
		t.Errorf("获取失败: %s", err)
		return
	}
	// 把查出来的结果json
	json, _ := getResult.Source.MarshalJSON()
	fmt.Printf("查询单条结果:%s \n", json)
}

批量查询

func TestSearchMoreEs(t *testing.T) {
	client, _ := connectEs()
	searchResult, err := client.Search(indexName).Query(elastic.NewMatchQuery("age", 18)).From(0).Size(10).Pretty(true).Do(context.Background())
	if err != nil {
		t.Errorf("获取失败: %s", err)
		return
	}
	// 创建集合 用来存放
	var userList []UserInfo
	for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
		tmp := i.(UserInfo)
		userList = append(userList, tmp)
	}
	fmt.Printf("查询结果:%v\n", userList)
}

精确匹配单个字段

func TestSearchByWhere(t *testing.T) {
	client, _ := connectEs()
	// 创建term
	termQuery := elastic.NewTermQuery("age", 18)
	searchResult, err := client.Search().
		// 设置索引名
		Index(indexName).
		// 设置查询条件
		Query(termQuery).
		// 设置排序字段 false 是逆序
		Sort("birth", true).
		// 分页参数
		From(0).Size(10). //设置每页的大小
		Pretty(true).     // 查询结果返回JSON格式
		// 执行请求
		Do(context.Background())
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	if searchResult.TotalHits() > 0 {
		// 创建集合 用来存放
		var userList []UserInfo
		for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
			tmp := i.(UserInfo)
			userList = append(userList, tmp)
		}
		fmt.Printf("查询结果:%v\n", userList)
	}
}

通过terms 实现Sql的in查询


// 通过terms 实现Sql  in 查询
func TestSearchByIn(t *testing.T) {
	client, _ := connectEs()
	termsQuery := elastic.NewTermsQuery("name", "mjd", "fjj")
	searchResult, err := client.Search().
		// 设置索引名
		Index(indexName).
		// 设置查询条件
		Query(termsQuery).
		// 设置排序字段 false 是逆序
		Sort("birth", true).
		// 分页参数
		From(0).Size(10). //设置每页的大小
		Pretty(true).     // 查询结果返回JSON格式
		// 执行请求
		Do(context.Background())
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	if searchResult.TotalHits() > 0 {
		// 创建集合 用来存放
		var userList []UserInfo
		for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
			tmp := i.(UserInfo)
			userList = append(userList, tmp)
		}
		fmt.Printf("查询结果:%v\n", userList)
	}
}

范围查询 类似于 某个值 >‘xx’ and 某个值 < ‘xxx’

// 范围查询
func TestSearchByRange(t *testing.T) {
	client, _ := connectEs()
	// >  <
	//elastic.NewRangeQuery("age").Gt("19").Lt("20")
	// >=  <=
	rangeQuery := elastic.NewRangeQuery("age").Gte("18").Lte("20")
	searchResult, err := client.Search().Index(indexName).Query(rangeQuery).Do(context.Background())
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	if searchResult.TotalHits() > 0 {
		// 创建集合 用来存放
		var userList []UserInfo
		for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
			tmp := i.(UserInfo)
			userList = append(userList, tmp)
		}
		fmt.Printf("查询结果:%v\n", userList)
	}

}

bool 组合查询

must 条件

// bool 组合查询
// 1 must 条件
func TestSearchMust(t *testing.T) {
	client, _ := connectEs()
	boolQuery := elastic.NewBoolQuery()
	// 创建term
	termQuery := elastic.NewTermQuery("name", "fjj")
	matchQuery := elastic.NewMatchQuery("age", 18)

	// 设置bool查询的must条件, 组合了两个子查询
	// 表示搜索匹配name=fjj且age匹配18
	boolQuery.Must(termQuery, matchQuery)

	searchResult, err := client.Search().
		Index(indexName).        // 设置索引名
		Query(boolQuery).        // 设置查询条件
		From(0).                 // 设置分页参数 - 起始偏移量,从第0行记录开始
		Size(10).                // 设置分页参数 - 每页大小
		Do(context.Background()) // 执行请求
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	if searchResult.TotalHits() > 0 {
		// 创建集合 用来存放
		var userList []UserInfo
		for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
			tmp := i.(UserInfo)
			userList = append(userList, tmp)
		}
		fmt.Printf("查询结果:%v\n", userList)
	}

}

must_not

// must_not
func TestSearchMustNot(t *testing.T) {
	client, _ := connectEs()
	// 创建bool
	boolQuery := elastic.NewBoolQuery()
	// 创建term
	termQuery := elastic.NewTermQuery("age", 18)
	// 设置条件
	query := boolQuery.MustNot(termQuery)
	searchResult, err := client.Search().Index(indexName).Query(query).Do(context.Background())
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	if searchResult.TotalHits() > 0 {
		// 创建集合 用来存放
		var userList []UserInfo
		for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
			tmp := i.(UserInfo)
			userList = append(userList, tmp)
		}
		fmt.Printf("查询结果:%v\n", userList)
	}
}

should 条件

// should 类似与OR
func TestSearchShould(t *testing.T) {
	client, _ := connectEs()
	// 创建bool查询
	boolQuery := elastic.NewBoolQuery().Must()

	// 创建term
	termQuery := elastic.NewTermQuery("name", "fjj")
	matchQuery := elastic.NewMatchQuery("age", 18)

	// 设置bool查询的should条件, 组合了两个子查询
	// 表示搜索匹配name=fjj且age匹配18
	boolQuery.Should(termQuery, matchQuery)
	searchResult, err := client.Search().
		Index(indexName).        // 设置索引名
		Query(boolQuery).        // 设置查询条件
		From(0).                 // 设置分页参数 - 起始偏移量,从第0行记录开始
		Size(10).                // 设置分页参数 - 每页大小
		Do(context.Background()) // 执行请求
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	if searchResult.TotalHits() > 0 {
		// 创建集合 用来存放
		var userList []UserInfo
		for _, i := range searchResult.Each(reflect.TypeOf(UserInfo{})) {
			tmp := i.(UserInfo)
			userList = append(userList, tmp)
		}
		fmt.Printf("查询结果:%v\n", userList)
	}
}

索引操作 聚合/桶操作

count 操作


// count 聚合
func TestTermsCount(t *testing.T) {
	// 链接客户端
	client, _ := connectEs()
	//获取提供上下文对象
	ctx := context.Background()
	// 创建value count 指标聚合
	countAggregation := elastic.NewValueCountAggregation().Field("age")
	searchResult, err := client.Search().Index(indexName). // 索引名
								Query(elastic.NewMatchAllQuery()).      // 设置搜索条件
								Aggregation("total", countAggregation). // 设置聚合条件,并为聚合条件设置一个名字,支持添加多个聚合条件,命名不一样即可。
								Size(0).                                // 分页
								Do(ctx)
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	// 使用ValueCount函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.ValueCount("total")
	if found {
		// 打印结果,注意:这里使用的是取值运算符
		fmt.Println(*agg.Value)
	}
}

类似SQL的count(DISTINCT 字段)用法。

func TestCountDistinct(t *testing.T) {
	// 链接客户端
	client, _ := connectEs()
	// 设置指标聚合
	cardinalityAggregation := elastic.NewCardinalityAggregation().Field("age")
	// 设置搜索条件
	searchResult, err := client.Search().
		Index("kibana_sample_data_flights").          // 设置索引名
		Query(elastic.NewMatchAllQuery()).            // 设置查询条件
		Aggregation("total", cardinalityAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0).                                      // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background())                      // 执行请求

	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用Cardinality函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Cardinality("total")
	if found {
		// 打印结果,注意:这里使用的是取值运算符
		fmt.Println(*agg.Value)
	}
}

Avg

// Avg
func TestAvg(t *testing.T) {
	client, _ := connectEs()
	// 创建 Avg 指标聚合
	avgAggregation := elastic.NewAvgAggregation().Field("age")
	searchResult, err := client.Search().
		Index(indexName).                         // 设置索引名
		Query(elastic.NewMatchAllQuery()).        // 设置查询条件
		Aggregation("avg_price", avgAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0).                                  // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background())                  // 执行请求

	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用Avg函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Avg("avg_price")
	if found {
		// 打印结果,注意:这里使用的是取值运算符
		fmt.Println(*agg.Value)
	}
}

Sum

// sum
func TestSum(t *testing.T) {
	client, _ := connectEs()
	// 创建Sum 聚合
	sumAggregation := elastic.NewSumAggregation().Field("age")
	searchResult, err := client.Search().
		Index(indexName).                           // 设置索引名
		Query(elastic.NewMatchAllQuery()).          // 设置查询条件
		Aggregation("total_price", sumAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0).                                    // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background())                    // 执行请求

	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用Sum函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Sum("total_price")
	if found {
		// 打印结果,注意:这里使用的是取值运算符
		fmt.Println(*agg.Value)
	}
}

Max

// Max
func TestMax(t *testing.T) {
	client, _ := connectEs()
	// 设置Max指标聚合
	newMaxAggregation := elastic.NewMaxAggregation().Field("age")
	searchResult, err := client.Search().
		Index(indexName). // 设置索引名
		Query(elastic.NewMatchAllQuery()). // 设置查询条件
		Aggregation("max_price", newMaxAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background()) // 执行请求

	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用Max函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Max("max_price")
	if found {
		// 打印结果,注意:这里使用的是取值运算符
		fmt.Println(*agg.Value)
	}
}

Min

func TestMin(t *testing.T) {
	client, _ := connectEs()
	// 设置min
	newMaxAggregation := elastic.NewMaxAggregation().Field("age")

	searchResult, err := client.Search().
		Index(indexName).                            // 设置索引名
		Query(elastic.NewMatchAllQuery()).           // 设置查询条件
		Aggregation("min_price", newMinAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0).                                     // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background())                     // 执行请求

	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用Min函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Min("min_price")
	if found {
		// 打印结果,注意:这里使用的是取值运算符
		fmt.Println(*agg.Value)
	}
}

聚合terms

// 聚合查询 terms
func TestTermsAggregation(t *testing.T) {
	// 链接客户端
	client, _ := connectEs()
	// 先通过名字分组
	termsAggregation := elastic.NewTermsAggregation().Field("name").Size(10).OrderByCountDesc()
	// 再通过生日中的年分组
	histogramAggregation := elastic.NewDateHistogramAggregation().Field("birth").CalendarInterval("year")
	// 设置嵌套聚合查询 意思先按照名字分组 ,在把名字分好组的通过生日字段中的年来分组。等于做了两次分组
	termsAggregation = termsAggregation.SubAggregation("histogramAggregation", histogramAggregation)
	// ES 查询
	searchResult, err := client.Search().
		Index(indexName).                                  // 索引名
		Query(elastic.NewMatchAllQuery()).                 // 设置查询条件
		Aggregation("termsAggregation", termsAggregation). // 设置聚合条件 需要给聚合设置一个名字
		Pretty(true).Do(context.Background())              // 返回可读的json
	if err != nil {
		t.Errorf("查询失败:%s", err)
		return
	}
	fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())
	// 遍历ES查询结果,因为首先使用的是terms聚合条件,
	// 所以查询结果先使用Terms函数和聚合条件的名字读取结果。
	bucketKeyItems, b := searchResult.Aggregations.Terms("termsAggregation")
	// 判断聚合结果是否为空
	if !b {
		// 没有查询到terms聚合结果
		fmt.Printf("we should have a terms aggregation called %q", "termsAggregation")
	}
	// 遍历桶数据
	for _, bucket := range bucketKeyItems.Buckets {
		// 每个桶都有一个key值 类似于 group by 的值
		user := bucket.Key
		// 查询嵌套聚合查询的数据
		// 因为我们使用的是Date histogram聚合,所以需要使用DateHistogram函数和聚合名字获取结果
		histogram, found := bucket.DateHistogram("histogramAggregation")
		if found {
			// 如果找到Date histogram聚合结果,则遍历桶数据
			for _, year := range histogram.Buckets {
				var key string
				if s := year.KeyAsString; s != nil {
					// 因为返回的是指针类型,这里做一下取值运算
					key = *s
				}
				// 打印结果
				fmt.Printf("user %q has %d tweets in %q\n", user, year.DocCount, key)
			}
		}
	}
}

Histogram聚合

func TestHistogram(t *testing.T) {
	client, _ := connectEs()
	// 创建Histogram 桶
	aggregation := elastic.NewHistogramAggregation().
		Field("age"). // 根据那个字段分组
		Interval(50)  // 分桶的间隔是50 意思就是age 字段值按照50间隔分组

	searchResult, err := client.Search().Index(indexName).Query(elastic.NewMatchAllQuery()). // 设置搜索条件
													Aggregation("age", aggregation).Size(0).Do(context.Background())
	if err != nil {
		// Handle error
		panic(err)
	}
	// 使用Histogram函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Histogram("age")
	if !found {
		log.Fatal("没有找到聚合数据")
	}

	// 遍历桶数据
	for _, bucket := range agg.Buckets {
		// 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
		bucketValue := bucket.Key

		// 打印结果, 默认桶聚合查询,都是统计文档总数
		fmt.Printf("bucket = %q 文档总数 = %d\n", bucketValue, bucket.DocCount)
	}
}

DateHistogram聚合


func TestDateHistogram(t *testing.T) {
	client, _ := connectEs()
	// 创建DateHistogram聚合
	histogramAggregation := elastic.NewDateHistogramAggregation().Field("birth").
		// 根据date字段值,对数据进行分组
		//  分组间隔:month代表每月、支持minute(每分钟)、hour(每小时)、day(每天)、week(每周)、year(每年)
		CalendarInterval("month").
		// 设置返回结果中桶key的时间格式
		Format("yyyy-MM-dd")
	searchResult, err := client.Search().
		Index(indexName).                                     // 设置索引名
		Query(elastic.NewMatchAllQuery()).                    // 设置查询条件
		Aggregation("sales_over_time", histogramAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0).                                              // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background())                              // 执行请求
	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用DateHistogram函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.DateHistogram("sales_over_time")
	if !found {
		log.Fatal("没有找到聚合数据")
	}

	// 遍历桶数据
	for _, bucket := range agg.Buckets {
		// 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
		bucketValue := bucket.Key

		// 打印结果, 默认桶聚合查询,都是统计文档总数
		fmt.Print("bucket = 文档总数 = ", bucketValue, bucket.DocCount)
	}
}

Range 聚合

func TestRange(t *testing.T) {
	client, _ := connectEs()
	// 设置 range 桶
	rangeAggregation := elastic.NewRangeAggregation().Field("age"). // 根据age字段分桶
		AddUnboundedFrom(30). // 范围配置, 0 - 30
		AddRange(30.0, 40.0). // 范围配置,30-40
		AddUnboundedTo(40.0) // 范围配置,> 200的值
	searchResult, err := client.Search().
		Index(indexName). // 设置索引名
		Query(elastic.NewMatchAllQuery()). // 设置查询条件
		Aggregation("price_ranges", rangeAggregation). // 设置聚合条件,并为聚合条件设置一个名字
		Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
		Do(context.Background()) // 执行请求

	if err != nil {
		// Handle error
		panic(err)
	}

	// 使用Range函数和前面定义的聚合条件名称,查询结果
	agg, found := searchResult.Aggregations.Range("price_ranges")
	if !found {
		log.Fatal("没有找到聚合数据")
	}

	// 遍历桶数据
	for _, bucket := range agg.Buckets {
		// 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
		bucketValue := bucket.Key

		// 打印结果, 默认桶聚合查询,都是统计文档总数
		fmt.Printf("bucket = %q 文档总数 = %d\n", bucketValue, bucket.DocCount)
	}
}

嵌套聚合的用法

任意聚合类型都支持嵌套,桶聚合可以嵌套桶聚合,也可以嵌套指标聚合。

例子:文章来源地址https://www.toymoban.com/news/detail-676527.html

// 创terms桶聚合
aggs := elastic.NewTermsAggregation().Field("shop_id")
// 创建Sum指标聚合
sumAggs := elastic.NewSumAggregation().Field("price")
// terms聚合嵌套指标聚合
aggs.SubAggregation("total_price", sumAggs)

到了这里,关于Go操作elasticsearch合集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(93)
  • golang第七卷---go中的数据结构

    分享一个go语言高级编程学习网站:Go语言高级编程 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。 因为数组的长度是固定的,所以在Go语言中很少直接使用数组。 Go语言数组的声明: 数组是定长的,不可更改,在编译阶段就决定了

    2024年02月03日
    浏览(57)
  • 【Golang】认识Go语言中基本的数据类型

    目录 整形 基本整型  特殊整型 浮点型 布尔型 字符型 字符串转义符  多行字符串 字符串的常用操作 复数 我们不论在学习什么语言中,我们都要去认识一下这个语言中的数据类型,当然学习Go也不例外,我们也要去认识一下其相关的数据类型,当然这些数据类型基本上是大

    2023年04月08日
    浏览(46)
  • go操作elasticsearch 如何打印query log

    我们在写代码调试的时候,有时候需要打印es的query log 看下请求json到底长什么样。在new的时候我们需要传一个 实现了 elasticsearch 这个包  Logger 接口的结构体进来。 package DbBase import (    \\\"fmt\\\"    \\\"log\\\"    \\\"net\\\"    \\\"net/http\\\"    \\\"time\\\"    \\\"github.com/spf13/viper\\\"    \\\"gopkg.in/olive

    2024年02月10日
    浏览(40)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(47)
  • 【Golang星辰图】数据管理利器:Go编程语言中的数据库和搜索引擎综合指南

    Go编程语言是一种强大、类型安全且高效的编程语言,它在处理数据库和搜索引擎方面有着广泛的应用。本篇文章将详细介绍几个Go编程语言中常用的数据库和全文搜索引擎,包括Go-bleve、Go-pgx、Go-leveldb/leveldb、Go-xorm、Go-mysql-driver和Go-bbolt/bbolt。对于每个工具,我们将介绍其功

    2024年03月26日
    浏览(72)
  • 1 Go语言开发环境搭建详细教程+go常见bug合集【Go语言教程】

    官网地址:golang.org,因为一些原因国内可能无法访问。可以使用下面第二个链接。 国内地址访问:https://golang.google.cn/dl或者https://www.golangtc.com/download 根据自己操作系统版本,下载安装即可,目录尽量选择全英文且没有空格和其他其他特殊字符。 2.1 Windows下 GOPATH:即默认的w

    2024年02月05日
    浏览(47)
  • Go学习[合集]

    个人博客:CSDN博客 打卡。 Go语言的核心开发团队: Ken Thompson (C语言,B语言,Unix的发明者,牛人) Rob Pike(UTF-8发明人) Robert Griesemer(协助HotSpot编译器,Js引擎V8) Go语言有静态语言的安全和性能和动态语言开发维护的效率。 Go语言特性 继承了C语言很多概念(Ken爷!)包括指针。

    2024年02月10日
    浏览(30)
  • 掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)

    在Go语言中,范围(range)用于迭代数组、切片、映射、通道等数据结构的元素。范围的语法形式为 for range ,可以遍历集合中的每个元素,并在每次迭代中返回元素的索引(或键)和对应的值。 Go语言范围使用方法 使用范围语句的一般形式为: 其中, index 是元素的索引(或

    2024年04月17日
    浏览(46)
  • Go语言操作MySql数据库

           go-sql-driver/mysql库是Go语言官方推荐的MySQL驱动库,可以很方便地实现对MySQL数据库的连接和操作。本文记录一下使用go-sql-driver/mysql数据库驱动来操作mysql数据库。 目录 1.安装驱动程序 2.导入驱动包 3.操作数据库 3.1 获取mysql版本 3.2 创建表 3.3 表中插入数据 3.4 表中删除

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包