1、前提
1.1 docker 安装elasticsearch
查询elasticsearch 版本
1
|
docker search elasticsearch
|
将对应的版本拉到本地
1
|
docker.elastic.co /elasticsearch/elasticsearch :7.3.0
|
创建一个网络
1
|
docker network create esnet
|
启动容器
1
|
docker run --name es -p 9200:9200 -p 9300:9300 --network esnet -e "discovery.type=single-node" bdaab402b220
|
1.2这里过后就可以去写go代码 为了直观搞了个可视化工具 ElisticHD 这里使用docker 部署
1
|
docker run -p 9800:9800 -d --link es:demo --network esnet -e "discovery.type=single-node" containerize /elastichd
|
可以试一下界面还是很美观的
2、golang 实现elasticsearch 简单的增删改查
直接上代码:
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
|
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/olivere/elastic/v7"
"reflect"
)
var client *elastic.Client
var host = "http://ip:port"
type Employee struct {
FirstName string `json: "first_name" `
LastName string `json: "last_name" `
Age int `json: "age" `
About string `json: "about" `
Interests []string `json: "interests" `
}
// 初始化
func init() {
//errorlog := log.New(os.Stdout, "APP" , log.LstdFlags)
var err error
// 这个地方有个小坑 不加上elastic.SetSniff( false ) 会连接不上
client, err = elastic.NewClient(elastic.SetSniff( false ), elastic.SetURL(host))
if err != nil {
panic(err)
}
_,_,err = client.Ping(host).Do(context.Background())
if err != nil {
panic(err)
}
//fmt .Printf( "Elasticsearch returned with code %d and version %s\n" , code, info.Version.Number)
_,err = client.ElasticsearchVersion(host)
if err != nil {
panic(err)
}
//fmt .Printf( "Elasticsearch version %s\n" , esversion)
}
/*下面是简单的CURD*/
// 创建
func create() {
// 使用结构体
e1 := Employee{ "Jane" , "Smith" , 32, "I like to collect rock albums" , []string{ "music" }}
put1, err := client.Index().
Index( "megacorp" ).
Type( "employee" ).
Id( "1" ).
BodyJson(e1).
Do(context.Background())
if err != nil {
panic(err)
}
fmt .Printf( "Indexed tweet %s to index s%s, type %s\n" , put1.Id, put1.Index, put1.Type)
// 使用字符串
e2 := `{ "first_name" : "John" , "last_name" : "Smith" , "age" :25, "about" : "I love to go rock climbing" , "interests" :[ "sports" , "music" ]}`
put2, err := client.Index().
Index( "megacorp" ).
Type( "employee" ).
Id( "2" ).
BodyJson(e2).
Do(context.Background())
if err != nil {
panic(err)
}
fmt .Printf( "Indexed tweet %s to index s%s, type %s\n" , put2.Id, put2.Index, put2.Type)
e3 := `{ "first_name" : "Douglas" , "last_name" : "Fir" , "age" :35, "about" : "I like to build cabinets" , "interests" :[ "forestry" ]}`
put3, err := client.Index().
Index( "megacorp" ).
Type( "employee" ).
Id( "3" ).
BodyJson(e3).
Do(context.Background())
if err != nil {
panic(err)
}
fmt .Printf( "Indexed tweet %s to index s%s, type %s\n" , put3.Id, put3.Index, put3.Type)
}
// 查找
func gets() {
// 通过 id 查找
get1, err := client.Get().Index( "megacorp" ).Type( "employee" ).Id( "2" ).Do(context.Background())
if err != nil {
panic(err)
}
if get1.Found {
fmt .Printf( "Got document %s in version %d from index %s, type %s\n" , get1.Id, get1.Version, get1.Index, get1.Type)
var bb Employee
err:=json.Unmarshal(get1.Source,&bb)
if err!=nil{
fmt .Println(err)
}
fmt .Println(bb.FirstName)
fmt .Println(string(get1.Source))
}
}
//
// 删除
func delete() {
res, err := client.Delete().Index( "megacorp" ).
Type( "employee" ).
Id( "1" ).
Do(context.Background())
if err != nil {
println(err.Error())
return
}
fmt .Printf( "delete result %s\n" , res.Result)
}
//
// 修改
func update() {
res, err := client.Update().
Index( "megacorp" ).
Type( "employee" ).
Id( "2" ).
Doc(map[string]interface{}{ "age" : 88}).
Do(context.Background())
if err != nil {
println(err.Error())
}
fmt .Printf( "update age %s\n" , res.Result)
}
//
//// 搜索
func query() {
var res *elastic.SearchResult
var err error
// 取所有
res, err = client.Search( "megacorp" ).Type( "employee" ).Do(context.Background())
printEmployee(res, err)
// 字段相等
q := elastic.NewQueryStringQuery( "last_name:Smith" )
res, err = client.Search( "megacorp" ).Type( "employee" ).Query(q).Do(context.Background())
if err != nil {
println(err.Error())
}
printEmployee(res, err)
// 条件查询
// 年龄大于30岁的
boolQ := elastic.NewBoolQuery()
boolQ.Must(elastic.NewMatchQuery( "last_name" , "smith" ))
boolQ.Filter(elastic.NewRangeQuery( "age" ).Gt(30))
res, err = client.Search( "megacorp" ).Type( "employee" ).Query(q).Do(context.Background())
printEmployee(res, err)
// 短语搜索 搜索about字段中有 rock climbing
matchPhraseQuery := elastic.NewMatchPhraseQuery( "about" , "rock climbing" )
res, err = client.Search( "megacorp" ).Type( "employee" ).Query(matchPhraseQuery).Do(context.Background())
printEmployee(res, err)
// 分析 interests
aggs := elastic.NewTermsAggregation().Field( "interests" )
res, err = client.Search( "megacorp" ).Type( "employee" ).Aggregation( "all_interests" , aggs).Do(context.Background())
printEmployee(res, err)
}
//
//// 简单分页
func list(size,page int) {
if size < 0 || page < 1 {
fmt .Printf( "param error" )
return
}
res,err := client.Search( "megacorp" ).
Type( "employee" ).
Size(size).
From((page-1)*size).
Do(context.Background())
printEmployee(res, err)
}
//
// 打印查询到的Employee
func printEmployee(res *elastic.SearchResult, err error) {
if err != nil {
print(err.Error())
return
}
var typ Employee
for _, item := range res.Each(reflect.TypeOf(typ)) { // 从搜索结果中取数据的方法
t := item.(Employee)
fmt .Printf( "%#v\n" , t)
}
}
func main() {
create()
delete()
update()
gets()
query()
list(2,1)
}
|
有一个小坑要注意在代码中已经注释了,如果没有添加就会有下面错误
no active connection found: no Elasticsearch node available
解决
Docker No Elastic Node Aviable
关闭sniff模式;或者设置es的地址为 publish_address
地址
代码设置 sniff 为false
到此这篇关于golang 操作 elasticsearch的实现的文章就介绍到这了,更多相关golang操作elasticsearch内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.jianshu.com/p/e3e40af0dba7