golang操作ES

目前golang操作elasticsearch的第三方包中最流行的是:

https://github.com/olivere/elastic


版本:

7.x 7.0 github.com/olivere/elastic/v7
6.x 6.0 github.com/olivere/elastic
5.x 5.0 gopkg.in/olivere/elastic.v5
例如:ES版本是7.0以后的版本,就使用github.com/olivere/elastic/v7这个包地址。

增删改查与基本操作
package main

import (
	"context"
	"log"
	"reflect"

	"github.com/olivere/elastic/v7"
)

func main(){
	case1()


}

type Data struct {
	Name string `json:"name"`
	Country string `json:"country"`
	Age int64 `json:"age"`
	Date string `json:"date"`
}

// 基础: 增删改查
func case1() {
	client, err := elastic.NewClient(
		elastic.SetSniff(false), 				// SetSniff启用或禁用嗅探器(默认情况下启用)。
		elastic.SetURL("http://192.168.0.192:9200"), 		// URL地址
		elastic.SetBasicAuth("elastic", "es123456"),	// 账号密码
	)

	if err != nil {
		panic(err)
	}
	log.Println("client = ", client)


	//判断索引是否存在
	//exists true 表示索引已存在
	//exists, err := con.ES().IndexExists(indexName).Do(context.Background())


	//删除索引
	//_, err = con.ES().DeleteIndex(indexName).Do(context.Background())


	// 修改索引
	//type mi = map[string]interface{}
	//mapping := mi{
	//	"properties": mi{
	//		"id": mi{  //整形字段, 允许精确匹配
	//			"type": "integer",
	//		},
	//	},
	//}
	// conf.ES().PutMapping().Index(indexName).Type("_doc").BodyJson(mapping).Do(context.Background())


	//数据迁移
	//将一个索引的数据迁移到另一个索引中, 一般用于索引结构发生改变时使用新索引存储数据
	//
	//type mi = map[string]interface{}
	//_, err = conf.ES().Reindex().Body(mi{
	//	"source": mi{
	//		"index": oldIndexName,
	//	},
	//	"dest": mi{
	//		"index": newIndexName,
	//	},
	//}).Do(context.Background())


	// 插入数据
	name := "god"
	data := `{
    "name": "liman",
    "country": "Chian",
    "age": 27,
    "date": "1995-06-20"
    }`
	_, err = client.Index().Index(name).Type("g").Id("1").BodyJson(data).Do(context.Background())
	if err != nil {
		log.Println("插入数据失败: ", err)
	}

	// 查找数据  通过id 查找
	get, err := client.Get().Index(name).Type("g").Id("1").Do(context.Background())
	log.Println("查找数据: ", get, err)
	log.Println(string(get.Source))

	// 修改
	res, err := client.Update().
		Index(name).
		Type("g").
		Id("1").
		Doc(map[string]interface{}{"age": 88}).
		Do(context.Background())
	if err != nil {
		println(err.Error())
	}
	log.Printf("update age %s\n", res.Result)

	get, err = client.Get().Index(name).Type("g").Id("1").Do(context.Background())
	log.Println("查找数据: ", get, err)
	log.Println(string(get.Source))


	// 删除数据
	del, err := client.Delete().Index(name).Type("g").Id("1").Do(context.Background())
	log.Println(del, err)

	get, err = client.Get().Index(name).Type("g").Id("1").Do(context.Background())
	log.Println("查找数据: ", get, err)

	// Search
	//_, err = conf.ES().Search().
	//	Index(indexName).
	//	//偏移量
	//	From(0).
	//	//返回数据的条数
	//	Size(10).
	//	//指定返回数据的字段(此处指定返回id和name), 全部返回则无需设置
	//	FetchSourceContext(elastic.NewFetchSourceContext(true).Include("id", "name")).
	//	//查询条件, 详细配置查询条件请查看章节 5
	//	Query(query).
	//	//按照id升序排序, 无需排序则可跳过此设置, 多个Sort会按先后顺序依次生效
	//	Sort("id", true).
	//	//自定义排序规则
	//	SortBy(sorter).
	//	Do(context.Background())

	_, err = client.Index().Index(name).Type("g").Id("1").BodyJson(data).Do(context.Background())
	if err != nil {
		log.Println("插入数据失败: ", err)
	}
	data2 := `{
    "name": "liman2",
    "country": "Chian",
    "age": 22,
    "date": "1995-06-20"
    }`
	_, err = client.Index().Index(name).Type("g").Id("2").BodyJson(data2).Do(context.Background())
	if err != nil {
		log.Println("插入数据失败: ", err)
	}

	res2, err := client.Search(name).Type("g").Do(context.Background())
	log.Println("res2 = ", res2, err)

	// 遍历1
	var typ Data
	for _, item := range res2.Each(reflect.TypeOf(typ)) {
		log.Println(item)
	}

	// 遍历2
	for _, v := range res2.Hits.Hits {
		log.Println(string(v.Source))
	}

	// 带条件查询
	q := elastic.NewQueryStringQuery("name:liman2")
	res3, err := client.Search(name).Type("g").Query(q).Do(context.Background())
	for _, v := range res3.Hits.Hits {
		log.Println(string(v.Source))
	}

	// 查询年龄大于25
	q1 := elastic.NewRangeQuery("age").Gt(25)
	res3, err = client.Search(name).Type("g").Query(q1).Do(context.Background())
	for _, v := range res3.Hits.Hits {
		log.Println(string(v.Source))
	}

	// 多个条件
	boolq := elastic.NewBoolQuery()
	boolq.Must(elastic.NewMatchQuery("name", "liman2"))
	boolq.Filter(elastic.NewRangeQuery("age").Gt(21))
	res3, err = client.Search(name).Type("g").Query(boolq).Do(context.Background())
	for _, v := range res3.Hits.Hits {
		log.Println(string(v.Source))
	}

	// 分页
	pg := 1
	size := 1
	res3, err = client.Search(name).Type("g").Size(size).From((pg - 1) * 1).Do(context.Background())
	for _, v := range res3.Hits.Hits {
		log.Println("分页: ", string(v.Source))
	}

	// range 范围匹配
	// id >= 10, id <= 100
	q4 := elastic.NewRangeQuery("age").Gte(20).Lte(25)
	res3, err = client.Search(name).Type("g").Query(q4).Do(context.Background())
	for _, v := range res3.Hits.Hits {
		log.Println("范围匹配 = ", string(v.Source))
	}

	// name字段模糊匹配
	q3 := elastic.NewMatchQuery("name", "*li*")
	res3, err = client.Search(name).Type("g").Query(q3).Do(context.Background())
	log.Println(res3, err)
	for _, v := range res3.Hits.Hits {
		log.Println("name字段模糊匹配 = ", string(v.Source))
	}

}

/*

条件查询
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)
}


//排序顺序, 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())



 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值