Go语言中的Elasticsearch操作:olivere实战

Go语言中的Elasticsearch操作:olivere实战

1. olivere简介

olivere/elastic是Go语言中流行的Elasticsearch客户端库,提供了完整的Elasticsearch API支持。本文将介绍如何使用olivere进行Elasticsearch操作。

2. 安装和连接

bash 复制代码
go get github.com/olivere/elastic/v7
go 复制代码
package main

import (
	"context"
	"fmt"
	"github.com/olivere/elastic/v7"
)

func main() {
	client, err := elastic.NewClient(
		elastic.SetURL("http://localhost:9200"),
		elastic.SetSniff(false),
	)
	if err != nil {
		panic(err)
	}
	defer client.Stop()

	info, code, err := client.Ping("http://localhost:9200").Do(context.Background())
	if err != nil {
		panic(err)
	}
	fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
}

3. 索引操作

3.1 创建索引

go 复制代码
func createIndex(client *elastic.Client) error {
	ctx := context.Background()
	
	mapping := `
	{
		"settings": {
			"number_of_shards": 1,
			"number_of_replicas": 0
		},
		"mappings": {
			"properties": {
				"title": {
					"type": "text"
				},
				"content": {
					"type": "text"
				},
				"created_at": {
					"type": "date"
				}
			}
		}
	}`
	
	_, err := client.CreateIndex("articles").BodyString(mapping).Do(ctx)
	return err
}

3.2 删除索引

go 复制代码
func deleteIndex(client *elastic.Client) error {
	ctx := context.Background()
	_, err := client.DeleteIndex("articles").Do(ctx)
	return err
}

4. 文档操作

4.1 添加文档

go 复制代码
type Article struct {
	Title     string    `json:"title"`
	Content   string    `json:"content"`
	CreatedAt time.Time `json:"created_at"`
}

func addDocument(client *elastic.Client, article *Article) error {
	ctx := context.Background()
	_, err := client.Index().
		Index("articles").
		BodyJson(article).
		Do(ctx)
	return err
}

4.2 查询文档

go 复制代码
func searchDocuments(client *elastic.Client, keyword string) ([]*Article, error) {
	ctx := context.Background()
	
	query := elastic.NewMultiMatchQuery(keyword, "title", "content")
	
	result, err := client.Search().
		Index("articles").
		Query(query).
		Sort("created_at", false).
		From(0).
		Size(10).
		Do(ctx)
	if err != nil {
		return nil, err
	}
	
	var articles []*Article
	for _, hit := range result.Hits.Hits {
		var article Article
		err := json.Unmarshal(hit.Source, &article)
		if err != nil {
			continue
		}
		articles = append(articles, &article)
	}
	
	return articles, nil
}

4.3 更新文档

go 复制代码
func updateDocument(client *elastic.Client, id string, article *Article) error {
	ctx := context.Background()
	_, err := client.Update().
		Index("articles").
		Id(id).
		Doc(article).
		Do(ctx)
	return err
}

4.4 删除文档

go 复制代码
func deleteDocument(client *elastic.Client, id string) error {
	ctx := context.Background()
	_, err := client.Delete().
		Index("articles").
		Id(id).
		Do(ctx)
	return err
}

5. 聚合查询

go 复制代码
func aggregateByDate(client *elastic.Client) error {
	ctx := context.Background()
	
	agg := elastic.NewDateHistogramAggregation().
		Field("created_at").
		CalendarInterval("day")
	
	result, err := client.Search().
		Index("articles").
		Aggregation("by_day", agg).
		Do(ctx)
	if err != nil {
		return err
	}
	
	aggResult, found := result.Aggregations.DateHistogram("by_day")
	if !found {
		return fmt.Errorf("aggregation not found")
	}
	
	for _, bucket := range aggResult.Buckets {
		fmt.Printf("Date: %s, Count: %d\n", *bucket.KeyAsString, bucket.DocCount)
	}
	
	return nil
}

6. 总结

使用olivere/elastic时应注意:

  1. 合理设置索引的mapping和settings
  2. 使用批量操作提高效率
  3. 配置合适的查询超时
  4. 使用聚合进行数据分析
  5. 监控集群健康状态
相关推荐
霸道流氓气质1 分钟前
Lingua 语言检测库:n-gram 统计模型、置信度阈值调优与 Spring Boot 分层检测管道的生产级实战
java·spring boot·后端
geovindu33 分钟前
rust: Read-Write Lock Pattern
开发语言·后端·设计模式·rust·读写锁模式·同步型模式
怪我冷i33 分钟前
Rust智能指针Rc<T> 使用总结
开发语言·后端·rust
万少42 分钟前
Harmony 7.0 这个skill帮你自动化操作AGC
前端·javascript·后端
huaweichenai1 小时前
spring boot对接kafka实现消息队列处理
spring boot·后端·kafka
treasure1401 小时前
Django复习笔记(2026年10月)
后端·python·django·api·web·drf
SEO_juper2 小时前
Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml
xml·开发语言·人工智能·golang·node.js·seo·外贸独立站
长弓三石2 小时前
Spring Boot 4.1 + AgentScope:企业级 Agent 平台的 MCP 双向集成实战
人工智能·spring boot·后端·harness·开源智能体
Cosolar12 小时前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架