1. 新建项目
项目git代码
相关学习网址
2.初始化go.mod
3.编写配置
package config
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
xorm "github.com/go-xorm/xorm"
elastic6 "github.com/olivere/elastic"
elastic7 "github.com/olivere/elastic/v7"
"log"
)
var GlobalConfig *Config
type Config struct {
Xm *xorm.Engine
EsClient6 *elastic6.Client
EsClient7 *elastic7.Client
}
func InitConfig() {
initMysql()
initEs6()
initEs7()
}
func initMysql() {
var err error
xm, err := xorm.NewEngine("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
if err != nil {
log.Fatal("数据库连接失败:", err)
return
}
fmt.Println("mysql 连接成功")
GlobalConfig = &Config{
Xm: xm,
}
}
func initEs6() {
host6 := "http://10.31.1.123:9300/"
client6, err := elastic6.NewClient(
elastic6.SetSniff(false),
elastic6.SetURL(host6),
)
if err != nil {
fmt.Printf("Es6 连接失败: %v\n", err)
return
} else {
GlobalConfig.EsClient6 = client6
fmt.Println("Es6 连接成功")
}
}
func initEs7() {
host7 := "http://10.31.1.123:9200/"
client7, err := elastic7.NewClient(
elastic7.SetSniff(false),
elastic7.SetURL(host7),
)
if err != nil {
fmt.Printf("Es7 连接失败: %v\n", err)
return
} else {
GlobalConfig.EsClient7 = client7
fmt.Println("Es7 连接成功")
}
}
编写main, 使用gin
package main
import (
"github.com/gin-gonic/gin"
"main/config"
"main/controller"
)
func main() {
config.InitConfig()
router := gin.Default()
router.GET("/sync", controller.Sync)
router.POST("/add", controller.Add)
router.POST("/update", controller.Update)
router.GET("/delete/:id", controller.Delete)
router.GET("/getById/:id", controller.GetById)
router.GET("/getList", controller.GetList)
router.GET("/createIndex6", controller.CreateCmsIndex6)
router.GET("/deleteIndex6", controller.DeleteCmsIndex6)
router.GET("/rebuildIndex6", controller.RebuildCmsIndex6)
router.GET("/searchDate6/:keyword", controller.SearchDate6)
router.GET("/createIndex7", controller.CreateCmsIndex7)
router.GET("/deleteIndex7", controller.DeleteCmsIndex7)
router.GET("/rebuildIndex7", controller.RebuildCmsIndex7)
router.GET("/searchDate7/:keyword", controller.SearchDate7)
router.Run(":10000")
}
编写controller
package controller
import (
"github.com/gin-gonic/gin"
"main/common"
"main/model"
"time"
)
func Sync(ctx *gin.Context) {
err := model.Sync()
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "create table ok", nil)
}
func Add(ctx *gin.Context) {
ctx.PostForm("title")
cms := &model.Cms{
Id: time.Now().Unix(),
Title: ctx.PostForm("title"),
Tags: ctx.PostForm("tags"),
Content: ctx.PostForm("content"),
}
err := model.Add(cms)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "add ok", nil)
}
func Update(ctx *gin.Context) {
err := model.Update()
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "update ok", nil)
}
func Delete(ctx *gin.Context) {
id, err := model.Delete(ctx.Param("id"))
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "delete ok", id)
}
func GetById(ctx *gin.Context) {
cms, err := model.GetById(ctx.Param("id"))
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "getById ok", cms)
}
func GetList(ctx *gin.Context) {
limit := ctx.Query("limit")
cmsList, err := model.GetList(limit)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "getById ok", cmsList)
}
package controller
import (
"context"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/olivere/elastic"
"main/common"
"main/config"
"main/model"
"strconv"
)
const mapping6_cms = `
{
"mappings": {
"cms": {
"properties": {
"id": {
"type": "keyword"
},
"tags": {
"type": "text"
},
"title": {
"type": "keyword"
},
"content": {
"type": "text"
},
"createTime": {
"type": "keyword"
},
"updateTime": {
"type": "keyword"
}
}
}
}
}`
const mapping6_cms_no_type = `
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"tags": {
"type": "text"
},
"title": {
"type": "keyword"
},
"content": {
"type": "text"
},
"createTime": {
"type": "keyword"
},
"updateTime": {
"type": "keyword"
}
}
}
}`
const mapping6_cms_ik_comma = `
{
"settings": {
"index": {
"number_of_shards": 5,
"number_of_replicas": 0
},
"analysis": {
"analyzer": {
"comma": {
"type": "pattern",
"pattern": ","
}
}
}
},
"mappings": {
"cms": {
"properties": {
"id": {
"type": "keyword"
},
"tags": {
"type": "text",
"analyzer": "comma",
"search_analyzer": "comma"
},
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"createTime": {
"type": "keyword"
},
"updateTime": {
"type": "keyword"
}
}
}
}
}`
func CreateCmsIndex6(ctx *gin.Context) {
client := config.GlobalConfig.EsClient6
exists, err := client.IndexExists("cms_index").Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
if !exists {
_, err := client.CreateIndex("cms_index").BodyString(mapping6_cms_ik_comma).Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
}
common.JSONResp(ctx, 200, "create 6 cms_index ok", nil)
}
func DeleteCmsIndex6(ctx *gin.Context) {
client := config.GlobalConfig.EsClient6
deleteIndex, err := client.DeleteIndex("cms_index").Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
if !deleteIndex.Acknowledged {
common.JSONResp(ctx, 500, "delete 6 cms_index fail", nil)
}
common.JSONResp(ctx, 200, "delete 6 cms_index ok", nil)
}
func RebuildCmsIndex6(ctx *gin.Context) {
client := config.GlobalConfig.EsClient6
cmsList, err := model.GetList("")
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
if len(cmsList) > 0 {
bulkRequest := client.Bulk()
for _, cms := range cmsList {
req := elastic.NewBulkIndexRequest().
Index("cms_index").
Type("cms").
Id(strconv.FormatInt(cms.Id, 10)).
Doc(cms)
bulkRequest = bulkRequest.Add(req)
}
bulkResponse, err := bulkRequest.Do(context.Background())
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
fmt.Println("耗时:", bulkResponse.Took, "索引了:", len(bulkResponse.Items))
}
common.JSONResp(ctx, 200, "add elastic 6,"+strconv.Itoa(len(cmsList))+"条数据", nil)
}
func SearchDate6(ctx *gin.Context) {
client := config.GlobalConfig.EsClient6
pageNo := 1
pageSize := 10
keyword := ctx.Param("keyword")
pageNoStr := ctx.Query("pageNo")
pageSizeStr := ctx.Query("pageSize")
if pageNoStr != "" && pageSizeStr == "" {
pageNo, _ = strconv.Atoi(pageNoStr)
pageSize, _ = strconv.Atoi(pageSizeStr)
}
qList := make([]elastic.Query, 0)
if keyword != "" {
machQuery := elastic.NewMatchQuery("title", keyword)
qList = append(qList, machQuery)
pressQuery := elastic.NewMatchQuery("tags", keyword)
qList = append(qList, pressQuery)
}
sortList := make([]elastic.Sorter, 0)
{
sortList = append(sortList, elastic.NewFieldSort("id").Desc())
}
boolMustQuery := elastic.NewBoolQuery().Should(qList...)
jsons, errs := json.Marshal(boolMustQuery)
if errs == nil {
fmt.Println(string(jsons))
}
rsp, err := client.Search().
Query(boolMustQuery).SortBy(sortList...).
From((pageNo - 1) * pageSize).Size(pageSize).
Index("cms_index").Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "", rsp)
}
package controller
import (
"context"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/olivere/elastic"
elastic7 "github.com/olivere/elastic/v7"
"main/common"
"main/config"
"main/model"
"strconv"
)
const mapping7_cms = `
{
"mappings": {
"cms": {
"properties": {
"id": {
"type": "keyword"
},
"tags": {
"type": "text"
},
"title": {
"type": "keyword"
},
"content": {
"type": "text"
},
"createTime": {
"type": "keyword"
},
"updateTime": {
"type": "keyword"
}
}
}
}
}`
const mapping7_cms2 = `
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"tags": {
"type": "text"
},
"title": {
"type": "keyword"
},
"content": {
"type": "text"
},
"createTime": {
"type": "keyword"
},
"updateTime": {
"type": "keyword"
}
}
}
}`
const mapping7_cms_ik_comma = `
{
"settings": {
"index": {
"number_of_shards": 5,
"number_of_replicas": 0
},
"analysis": {
"analyzer": {
"comma": {
"type": "pattern",
"pattern": ","
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"tags": {
"type": "text",
"analyzer": "comma",
"search_analyzer": "comma"
},
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"createTime": {
"type": "keyword"
},
"updateTime": {
"type": "keyword"
}
}
}
}`
func CreateCmsIndex7(ctx *gin.Context) {
client := config.GlobalConfig.EsClient7
exists, err := client.IndexExists("cms_index").Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
if !exists {
_, err := client.CreateIndex("cms_index").BodyString(mapping7_cms_ik_comma).Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
}
common.JSONResp(ctx, 200, "create 7 cms_index ok", nil)
}
func DeleteCmsIndex7(ctx *gin.Context) {
client := config.GlobalConfig.EsClient7
deleteIndex, err := client.DeleteIndex("cms_index").Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
if !deleteIndex.Acknowledged {
common.JSONResp(ctx, 500, "delete 7 cms_index fail", nil)
}
common.JSONResp(ctx, 200, "delete 7 cms_index ok", nil)
}
func RebuildCmsIndex7(ctx *gin.Context) {
client := config.GlobalConfig.EsClient7
cmsList, err := model.GetList("")
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
if len(cmsList) > 0 {
bulkRequest := client.Bulk()
for _, cms := range cmsList {
req := elastic.NewBulkIndexRequest().
Index("cms_index").
Id(strconv.FormatInt(cms.Id, 10)).
Doc(cms)
bulkRequest = bulkRequest.Add(req)
}
bulkResponse, err := bulkRequest.Do(context.Background())
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
fmt.Println("耗时:", bulkResponse.Took, "索引了:", len(bulkResponse.Items))
}
common.JSONResp(ctx, 200, "add 7 elastic"+strconv.Itoa(len(cmsList))+"条数据", nil)
}
func SearchDate7(ctx *gin.Context) {
client := config.GlobalConfig.EsClient7
pageNo := 1
pageSize := 10
keyword := ctx.Param("keyword")
pageNoStr := ctx.Query("pageNo")
pageSizeStr := ctx.Query("pageSize")
if pageNoStr != "" && pageSizeStr == "" {
pageNo, _ = strconv.Atoi(pageNoStr)
pageSize, _ = strconv.Atoi(pageSizeStr)
}
qList := make([]elastic7.Query, 0)
if keyword != "" {
machQuery := elastic7.NewMatchQuery("title", keyword)
qList = append(qList, machQuery)
pressQuery := elastic7.NewMatchQuery("tags", keyword)
qList = append(qList, pressQuery)
}
sortList := make([]elastic7.Sorter, 0)
{
sortList = append(sortList, elastic7.NewFieldSort("id").Desc())
}
boolMustQuery := elastic7.NewBoolQuery().Should(qList...)
jsons, errs := json.Marshal(boolMustQuery)
if errs == nil {
fmt.Println(string(jsons))
}
rsp, err := client.Search().
Query(boolMustQuery).SortBy(sortList...).
From((pageNo - 1) * pageSize).Size(pageSize).
Index("cms_index").Do(ctx)
if err != nil {
common.JSONResp(ctx, 500, err.Error(), nil)
return
}
common.JSONResp(ctx, 200, "", rsp)
}
xorm model操作数据库
package model
import (
"fmt"
"main/config"
)
type Cms struct {
Id int64 `xorm:"pk autoincr" json:"id"`
Title string `xorm:"unique" json:"title"`
Tags string `json:"tags"`
Content string `json:"content"`
UpdateTime int64 `xorm:"updated" json:"updateTime"`
CreatTime int64 `xorm:"created" json:"creatTime"`
}
func Sync() error {
if err := config.GlobalConfig.Xm.Sync(new(Cms)); err != nil {
return err
}
return nil
}
func Add(cms *Cms) error {
cmsA := new(Cms)
cmsA.Id = cms.Id
cmsA.Title = cms.Title
cmsA.Tags = cms.Tags
id, err := config.GlobalConfig.Xm.Insert(cmsA)
fmt.Println("id:", id)
if err != nil {
return err
}
return nil
}
func Update() error {
return nil
}
func Delete(id string) (int64, error) {
rt, err := config.GlobalConfig.Xm.Id(id).Delete(new(Cms))
if err != nil {
return rt, err
}
return rt, nil
}
func GetById(id string) (*Cms, error) {
cms := &Cms{}
flag, err := config.GlobalConfig.Xm.SQL("select * from cms where id=" + id).Get(cms)
if !flag || err != nil {
return nil, err
}
return cms, nil
}
func GetList(limit string) ([]*Cms, error) {
var cmsList = make([]*Cms, 0)
var sql = "select * from cms"
if limit != "" {
sql = sql + " limit " + limit
}
err := config.GlobalConfig.Xm.SQL(sql).Find(&cmsList)
if err != nil {
return nil, err
}
return cmsList, nil
}