• 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())
    
    
    
     */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
  • 相关阅读:
    stm32——hal库学习笔记(SPI)
    Mysql索引原理
    java基于ssm+vue的实验室课程资料管理系统 elementui
    架设好传奇登录器显示无法连接服务器,完美登录器使用常见问题解决办法
    微信小程序检查版本更新并重启
    rocketmq是如何消费
    基础复习——activity的跳转-启动-结束——Activity的生命周期——Activity的启动模式(配置文件里面设置&代码里面设置)——重点...
    Docker从入门到进阶之进阶操作(3) —— 使用 supermin5来构建镜像
    做好性能测试计划的4个步骤!全都是精华!【建议收藏】
    SpringBoot学习(1) —— 初始化SpringBoot开发环境
  • 原文地址:https://blog.csdn.net/Man_ge/article/details/128204528