package main
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"log"
"github.com/olivere/elastic"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Id int `json:"-"`
Name string `json:"name"`
Age int `json:"age"`
Gender string `json:"gender"`
}
func main() {
// 创建 MySQL 数据库连接
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 初始化 ES 连接
client, err := elastic.NewClient(elastic.SetURL("http://127.0.0.1:9200"))
if err != nil {
log.Fatal(err)
}
// 创建 ES 索引
indexName := "user"
exists, err := client.IndexExists(indexName).Do(context.Background())
if err != nil {
log.Fatal(err)
}
if !exists {
_, err = client.CreateIndex(indexName).Do(context.Background())
if err != nil {
log.Fatal(err)
}
}
// 向 ES 中添加数据
rows, err := db.Query("SELECT * FROM user")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
user := User{}
err = rows.Scan(&user.Id, &user.Name, &user.Age, &user.Gender)
if err != nil {
log.Fatal(err)
}
_, err = client.Index().Index(indexName).BodyJson(user).Do(context.Background())
if err != nil {
log.Fatal(err)
}
}
// 从 ES 中查询数据
query := elastic.NewBoolQuery().Should(
elastic.NewMatchQuery("name", "Tom"),
elastic.NewMatchQuery("age", 18),
elastic.NewMatchQuery("gender", "Male"),
)
searchResult, err := client.Search().Index(indexName).Query(query).Do(context.Background())
if err != nil {
log.Fatal(err)
}
if searchResult.Hits.TotalHits.Value >0 {
for _, hit := range searchResult.Hits.Hits {
user := User{}
err := json.Unmarshal(hit.Source, &user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %d, name: %s, age: %d, gender: %s\n", user.Id, user.Name, user.Age, user.Gender)
}
} else {
fmt.Println("No results found.")
}
}
以上代码演示了如何使用 Go 语言连接 ES 和 MySQL,将 MySQL 中的数据导入到 ES 并在 ES 中查询数据。通过使用 ES 和 MySQL 的组合,大家可以方便地进行数据查询和分析,从而更好地解决应用程序中的大数据问题。