ZBLOG

golang es 中文分词,聚合查询

在 Elasticsearch 中,中文分词和聚合查询是非常常见的功能。以下是如何在 Go 中使用官方客户端库实现这些功能:

中文分词

Elasticsearch 默认支持中文分词器,可以使用 ik_max_wordik_smart 分词器来处理中文字段。在 Go 中,可以通过 mapping 来指定字段的类型和分词器。

  1. import (
  2. "context"
  3. "fmt"
  4. "github.com/elastic/go-elasticsearch/v7"
  5. "github.com/elastic/go-elasticsearch/v7/esapi"
  6. )
  7. func main() {
  8. es, _ := elasticsearch.NewDefaultClient()
  9. var mapping = `
  10. {
  11. "mappings": {
  12. "properties": {
  13. "content": {
  14. "type": "text",
  15. "analyzer": "ik_max_word" // 使用 ik_max_word 分词器
  16. }
  17. }
  18. }
  19. }`
  20. res, err := es.Indices.Create(
  21. []string{"my-index"},
  22. es.Indices.Create.WithBody(strings.NewReader(mapping)),
  23. es.Indices.Create.WithPretty(),
  24. )
  25. if err != nil {
  26. log.Fatalf("Error creating index: %s", err)
  27. }
  28. }

然后,在执行查询时,可以使用 MatchQuery 或其他查询类型来搜索包含指定关键字的文档。

  1. var buf bytes.Buffer
  2. query := map[string]interface{}{
  3. "query": map[string]interface{}{
  4. "match": map[string]interface{}{
  5. "content": "中国",
  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 getting response: %s", err)
  21. }

聚合查询

聚合查询是对搜索结果进行分组、统计和分析的一种功能。在 Go 中,可以使用 AggregationsBucket 来执行聚合查询。

  1. var buf bytes.Buffer
  2. query := map[string]interface{}{
  3. "size": 0,
  4. "aggs": map[string]interface{}{
  5. "group_by_category": map[string]interface{}{
  6. "terms": map[string]interface{}{
  7. "field": "category",
  8. },
  9. },
  10. "stats_on_price": map[string]interface{}{
  11. "stats": map[string]interface{}{
  12. "field": "price",
  13. },
  14. },
  15. },
  16. }
  17. if err := json.NewEncoder(&buf).Encode(query); err != nil {
  18. log.Fatalf("Error encoding query: %s", err)
  19. }
  20. res, err := es.Search(
  21. es.Search.WithContext(context.Background()),
  22. es.Search.WithIndex("my-index"),
  23. es.Search.WithBody(&buf),
  24. es.Search.WithTrackTotalHits(true),
  25. )
  26. if err != nil {
  27. log.Fatalf("Error getting response: %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.Printf("Error parsing the response body: %s", err)
  33. } else {
  34. // 处理聚合结果
  35. groupByCategoryBuckets := r["aggregations"].(map[string]interface{})["group_by_category"].(map[string]interface{})["buckets"].([]interface{})
  36. for _, bucket := range groupByCategoryBuckets {
  37. key := bucket.(map[string]interface{})["key"]
  38. docCount := bucket.(map[string]interface{})["doc_count"]
  39. fmt.Printf("%s: %d\n", key, docCount)
  40. }
  41. statsOnPrice := r["aggregations"].(map[string]interface{})["stats_on_price"].(map[string]interface{})
  42. count := statsOnPrice["count"]
  43. min := statsOnPrice["min"]
  44. max := statsOnPrice["max"]
  45. avg := statsOnPrice["avg"]
  46. sum := statsOnPrice["sum"]
  47. fmt.Printf("count: %v, min: %v, max: %v, avg: %v, sum: %v\n", count, min, max, avg, sum)
  48. }

以上是在 Go 中使用官方 Elasticsearch 客户端库执行中文分词和聚合查询的示例。可以根据具体需求来选择合适的分词器和聚合查询选项。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?