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. 监控集群健康状态
相关推荐
Tomhex2 小时前
Go语言import用法详解
golang·go
小旭95272 小时前
Spring Security 实现权限控制(认证 + 授权全流程)
java·后端·spring
weixin_408099672 小时前
【完整教程】天诺脚本如何调用 OCR 文字识别 API?自动识别屏幕文字实战(附代码)
前端·人工智能·后端·ocr·api·天诺脚本·自动识别文字脚本
金銀銅鐵2 小时前
[Java] 如何通过 cglib 的 FastClass 调用一个类中的“任意”方法?
java·后端
宠友信息3 小时前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app
Tomhex4 小时前
Golang空白导入的真正用途
golang·go
小信丶4 小时前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
ffqws_4 小时前
Spring Boot入门:通过简单的注册功能串联Controller,Service,Mapper。(含有数据库建立,连接,及一些关键注解的讲解)
数据库·spring boot·后端
程序边界4 小时前
行标识符机制的技术演进与实践(下)——ROWID与实战应用
后端