golang中使用elasticsearch之olivere elastic汇总

本文介绍了如何使用golang的olivereelastic库连接、查询、创建、更新和删除Elasticsearch文档。通过示例代码展示了基本操作,包括客户端连接、ping检查、查看版本、创建和修改文档、批量操作、删除文档以及各种查询方式。强调了逻辑删除的重要性,并提供了组合查询、排序、筛选和统计等高级功能的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

olivere elastic作为golang比较常用的elasticsearch工具包,接下来我将讲解如何使用。

有兴趣的可以去看一下:olivere elastic 官方源码

1.版本
go get github.com/olivere/elastic/v7
2.客户端连接
func init(){
    client, err = elastic.NewClient(
		elastic.SetSniff(false), 				// SetSniff启用或禁用嗅探器(默认情况下启用)。
        elastic.SetURL("127.0.0.1:9090"), 		// URL地址
		elastic.SetBasicAuth("username", "password"),	// 账号密码
	)

	if err != nil {
		panic(err)
	}
}
2.Ping检查集群中的节点
client.Ping(host).Do(context.Background())
3.查看版本
client.ElasticsearchVersion(host)
4. 创建文档
a) 结构体形式
type user struct {
	name string
	age int
}

func main(){
    u := user{
		name: "wunder",
		age: 18,
	}
	_, err := client.Index().
    	Index("index_name").  		// 索引名称
    	Id("id").					// 指定文档id
    	BodyJson(u).				// 可序列化JSON
    	Do(context.Background())
	
    if err != nil {
		panic(err)
	}
}
b) 字符串形式
u := `{"name":"wunder", "age": 1}`
_, err := client.Index().
	Index("index_name").  		// 索引名称
	Id("id").					// 指定文档id
	BodyJson(u).				// 可序列化JSON
	Do(context.Background())

if err != nil {
	panic(err)
}
5.修改文档

elasticsearch的修改文档是可以直接用创建去替换,如果单字段修改可以使用以下修改:

_, err := client.Update().
	Index("index_name").
	Id("id").
	Doc(map[string]interface{}{"name":"wunder"}). // 需要修改的字段值
	Do(context.Background())

if err != nil {
	panic(err)
}
6.批量操作
type user struct {
	id string
	name string
	age int
}
func main() {
	users := []user{
		{
			id: "1",
			name: "wunder",
			age: 18,
		},
		{
			id: "2",
			name: "sun",
			age: 20,
		},
	}
	bulkRequest := client.Bulk()   								//初始化新的BulkService。
	for _, u := range users {
		doc := elastic.NewBulkUpdateRequest().Id(u.id).Doc(u)  	// 创建一个更新请求
		bulkRequest = bulkRequest.Add(doc)						// 添加到批量操作
	}
	_, err := bulkRequest.Do(context.Background())
	if err != nil {
		panic(err)
	}

}
7. 删除文档

注意:在实际开发中不建议直接删除文档,可以定义delete_time字段做逻辑删除。

_, err := client.Delete().Index("index_name").
		Id("id").
		Do(context.Background())
if err != nil {
   panic(err)
}
8.查询操作
a) 通过id查询
ret, err := client.Get().Index("index_name").
		Id("id").					// 文档id 
		Do(context.Background())
if err != nil {
	panic(err)
}
fmt.Printf("id:%s \n Source:%s ", ret.Id, string(ret.Source))
b) 条件查询
var query elastic.Query

// match_all
query = elastic.NewMatchAllQuery()

// term
query = elastic.NewTermQuery("field_name", "field_value")

// terms
query = elastic.NewTermsQuery("field_name", "field_value")

// match
query = elastic.NewMatchQuery("field_name", "field_value")

// match_phrase
query = elastic.NewMatchPhraseQuery("field_name", "field_value")

// match_phrase_prefix
query = elastic.NewMatchPhrasePrefixQuery("field_name", "field_value")

//range Gt:大于; Lt:小于; Gte:大于等于; Lte:小于等
query = elastic.NewRangeQuery("field_name").Gte(1).Lte(2)

//regexp
query = elastic.NewRegexpQuery("field_name", "regexp_value")

_, err := client.Search().Index("index_name").Query(query).Do(context.Background())

if err != nil {
	panic(err)
}
c) 组合查询
// 创建新的bool查询
query := elastic.NewBoolQuery()

// must
query.Must(elastic.NewTermQuery("name", "wunder"))

// should
query.Should(elastic.NewTermQuery("age", 18))

//must_not
query.MustNot(elastic.NewTermQuery("age", 20))

// 结果: {"bool":{"must":{"term":{"name":"wunder"}},"must_not":{"term":{"age":20}},"should":{"term":{"age":18}}}}

_, err := client.Search().Index("index_name").Query(query).Do(context.Background())
if err != nil {
	panic(err)
}
d) 其他筛选
// 文档查询数量,默认为10。
client.Search().Index("index_name").Size(100).Do(context.Background())

//开始搜索的索引,默认为0。
client.Search().Index("index_name").From(100).Do(context.Background())

//排序顺序, true为降徐, false为升序
client.Search().Index("index_name").Sort("field_name", true).Do(context.Background())

// 还可以通过SortBy进行多个排序
sorts := []elastic.Sorter{
	elastic.NewFieldSort("field_name01").Asc(), // 升序
	elastic.NewFieldSort("field_name02").Desc(), // 降徐
}
client.Search().Index("index_name").SortBy(sorts...).Do(context.Background())

// 返回指定字段
includes:= []string{"name", "age"}
include := elastic.NewFetchSourceContext(true).Include(includes...)
client.Search().Index("index_name").FetchSourceContext(include).Do(context.Background())

//查询的总命中计数
client.Search().Index("index_name").TrackTotalHits(true).Do(context.Background())

e) 打印bool查询语句
// 创建新的bool查询
query := elastic.NewBoolQuery()

query.Must(elastic.NewTermQuery("name", "wunder"))

source, _ := query.Source()
fmt.Println(source)
// 结果:map[bool:map[must:map[term:map[name:wunder]]]]
总结

olivere elastic只是一个工具,想要灵活使用这个工具可以去看一下官方文档或者源码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值