ZBLOG

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

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

Term 查询

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

  1. import (
  2. "context"
  3. "fmt"
  4. "github.com/elastic/go-elasticsearch/v7"
  5. )
  6. func main() {
  7. es, _ := elasticsearch.NewDefaultClient()
  8. var buf bytes.Buffer
  9. query := map[string]interface{}{
  10. "query": map[string]interface{}{
  11. "term": map[string]string{
  12. "name.keyword": "John",
  13. },
  14. },
  15. }
  16. if err := json.NewEncoder(&buf).Encode(query); err != nil {
  17. log.Fatalf("Error encoding query: %s", err)
  18. }
  19. res, err := es.Search(
  20. es.Search.WithContext(context.Background()),
  21. es.Search.WithIndex("my-index"),
  22. es.Search.WithBody(&buf),
  23. es.Search.WithTrackTotalHits(true),
  24. es.Search.WithPretty(),
  25. )
  26. if err != nil {
  27. log.Fatalf("Error searching for documents: %s", err)
  28. }
  29. defer res.Body.Close()
  30. var r map[string]interface{}
  31. if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
  32. log.Fatalf("Error parsing the response body: %s", err)
  33. }
  34. totalHits := int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64))
  35. fmt.Printf("Found %d documents\n", totalHits)
  36. }

Match 查询

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

  1. var buf bytes.Buffer
  2. query := map[string]interface{}{
  3. "query": map[string]interface{}{
  4. "match": map[string]string{
  5. "name": "John",
  6. },
  7. },
  8. }
  9. if err := json.NewEncoder(&buf).Encode(query); err != nil {
  10. log.Fatalf("Error encoding query: %s", err)
  11. }
  12. res, err := es.Search(
  13. es.Search.WithContext(context.Background()),
  14. es.Search.WithIndex("my-index"),
  15. es.Search.WithBody(&buf),
  16. es.Search.WithTrackTotalHits(true),
  17. es.Search.WithPretty(),
  18. )
  19. if err != nil {
  20. log.Fatalf("Error searching for documents: %s", err)
  21. }
  22. defer res.Body.Close()
  23. var r map[string]interface{}
  24. if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
  25. log.Fatalf("Error parsing the response body: %s", err)
  26. }
  27. totalHits := int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64))
  28. fmt.Printf("Found %d documents\n", totalHits)

Aggregation

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

  1. var buf bytes.Buffer
  2. aggQuery := map[string]interface{}{
  3. "aggs": map[string]interface{}{
  4. "avg_age": map[string]interface{}{
  5. "avg": map[string]interface{}{
  6. "field": "age",
  7. },
  8. },
  9. },
  10. }
  11. query := map[string]interface{}{
  12. "size": 0,
  13. }
  14. query["aggs"] = aggQuery
  15. if err := json.NewEncoder(&buf).Encode(query); err != nil {
  16. log.Fatalf("Error encoding query: %s", err)
  17. }
  18. res, err := es.Search(
  19. es.Search.WithContext(context.Background()),
  20. es.Search.WithIndex("my-index"),
  21. es.Search.WithBody(&buf),
  22. es.Search.WithTrackTotalHits(true),
  23. es.Search.WithPretty(),
  24. )
  25. if err != nil {
  26. log.Fatalf("Error searching for documents: %s", err)
  27. }
  28. defer res.Body.Close()
  29. var r map[string]interface{}
  30. if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
  31. log.Fatalf("Error parsing the response body: %s", err)
  32. }
  33. aggResult := r["aggregations"].(map[string]interface{})["avg_age"].(map[string]interface{})
  34. avgAge := aggResult["value"].(float64)
  35. 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

注册

已经有帐号?