/
elastic.go
74 lines (67 loc) · 1.48 KB
/
elastic.go
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
package main
import (
"context"
"github.com/olivere/elastic"
"github.com/icrowley/fake"
"encoding/json"
)
type User struct {
Username string `json:"username"`
Email string `json:"email"`
RealName string `json:"real_name"`
}
func Populate(number int) error {
client, err := elastic.NewClient(elastic.SetURL("http://elasticsearch:9200"))
if err != nil {
return err
}
idxExists, err := client.IndexExists("users").Do(context.Background())
if err != nil {
return err
}
if !idxExists {
client.CreateIndex("users").Do(context.Background())
}
for i := 0; i < number; i++ {
user := User{
Username: fake.UserName(),
Email: fake.EmailAddress(),
RealName: fake.FullName(),
}
_, err = client.Index().
Index("users").
Type("doc").
BodyJson(user).
Do(context.Background())
if err != nil {
return err
}
}
return nil
}
func Search(term string, from, size int) ([]*User, error) {
client, err := elastic.NewClient(elastic.SetURL("http://elasticsearch:9200"))
if err != nil {
return nil, err
}
q := elastic.NewMultiMatchQuery(term, "username", "email", "real_name").Fuzziness("AUTO:2,5")
res, err := client.Search().
Index("users").
Query(q).
From(from).
Size(size).
Do(context.Background())
if err != nil {
return nil, err
}
users := make([]*User, 0)
for _, hit := range res.Hits.Hits {
var user User
err := json.Unmarshal(*hit.Source, &user)
if err != nil {
return nil, err
}
users = append(users, &user)
}
return users, nil
}