ZBLOG

golang es 高级查询:term,match,aggregation

在 Go 中,可以使用官方 Elasticsearch 客户端库来进行高级查询,包括 term、match 和聚合操作。

Term 查询

Term 查询是一个完全匹配的查询。它查找指定字段中包含指定值的文档。以下是一个示例:

import (
	"context"
	"fmt"
	"github.com/elastic/go-elasticsearch/v7"
)

func main() {
    es, _ := elasticsearch.NewDefaultClient()
    
    var buf bytes.Buffer
    query := map[string]interface{}{
        "query": map[string]interface{}{
            "term": map[string]string{
                "name.keyword": "John",
            },
        },
    }
    
    if err := json.NewEncoder(&buf).Encode(query); err != nil {
        log.Fatalf("Error encoding query: %s", err)
    }
    
    res, err := es.Search(
        es.Search.WithContext(context.Background()),
        es.Search.WithIndex("my-index"),
        es.Search.WithBody(&buf),
        es.Search.WithTrackTotalHits(true),
        es.Search.WithPretty(),
    )
    
    if err != nil {
        log.Fatalf("Error searching for documents: %s", err)
    }
    
    defer res.Body.Close()
    
    var r map[string]interface{}
    
    if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
        log.Fatalf("Error parsing the response body: %s", err)
    }
    
	totalHits := int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64))
	
	fmt.Printf("Found %d documents\n", totalHits)
}

Match 查询

Match 查询会根据查询条件对指定字段进行分词并搜索匹配的文档。以下是一个示例:

var buf bytes.Buffer
query := map[string]interface{}{
    "query": map[string]interface{}{
        "match": map[string]string{
            "name": "John",
        },
    },
}

if err := json.NewEncoder(&buf).Encode(query); err != nil {
    log.Fatalf("Error encoding query: %s", err)
}

res, err := es.Search(
    es.Search.WithContext(context.Background()),
    es.Search.WithIndex("my-index"),
    es.Search.WithBody(&buf),
    es.Search.WithTrackTotalHits(true),
    es.Search.WithPretty(),
)

if err != nil {
    log.Fatalf("Error searching for documents: %s", err)
}

defer res.Body.Close()

var r map[string]interface{}

if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
    log.Fatalf("Error parsing the response body: %s", err)
}

totalHits := int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64))

fmt.Printf("Found %d documents\n", totalHits)

Aggregation

聚合操作可以对搜索结果进行统计和分析,例如计算平均值、最大值等。以下是一个示例:

var buf bytes.Buffer
aggQuery := map[string]interface{}{
	"aggs": map[string]interface{}{
		"avg_age": map[string]interface{}{
			"avg": map[string]interface{}{
				"field": "age",
			},
		},
	},
}
query := map[string]interface{}{
	"size": 0,
}
query["aggs"] = aggQuery

if err := json.NewEncoder(&buf).Encode(query); err != nil {
	log.Fatalf("Error encoding query: %s", err)
}

res, err := es.Search(
	es.Search.WithContext(context.Background()),
	es.Search.WithIndex("my-index"),
	es.Search.WithBody(&buf),
	es.Search.WithTrackTotalHits(true),
	es.Search.WithPretty(),
)

if err != nil {
	log.Fatalf("Error searching for documents: %s", err)
}

defer res.Body.Close()

var r map[string]interface{}

if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
	log.Fatalf("Error parsing the response body: %s", err)
}

aggResult := r["aggregations"].(map[string]interface{})["avg_age"].(map[string]interface{})
avgAge := aggResult["value"].(float64)

fmt.Printf("Average age is %f\n", avgAge)

以上是在 Go 中使用官方 Elasticsearch 客户端库进行 term、match 和聚合操作的一些示例。可以根据具体需求来选择合适的选项和参数。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6765

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?