GO-GIN学习笔记【es操作和路由一】


文章目录

  • GO-GIN学习笔记【es操作和路由一】
  • GO的ES操作
  • GO的ES查询全部
  • GO的ES查询指定起始数据
  • 编写must查询条件的数据
  • BodyJosn
  • Update
  • Delete
  • GO的路由设置
  • GO接收参数
  • GET参数接收
  • POST表单参数接收
  • GO绑定接收JSON数据


GO的ES操作

首先引入es的扩展包

注意:这边踩到了一个坑,默认引入"github.com/olivere/elastic",这个时候版本是v6的,正常查询后结构解析总是报错,所以必须保证引入是v7的

import (
   "github.com/olivere/elastic/v7"
)

连接es库

Client, _ = elastic.NewClient(
		elastic.SetURL(”es的地址“),//es的地址
		elastic.SetSniff(false),//设置节点是否调用给定的SnifferCallback,就是是否回调
		elastic.SetBasicAuth("用户名", "密码"),//设置账号棉麻
		elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)), //输出错误信息到stderr
		elastic.SetHealthcheckInterval(30*time.Second),//设置两次健康检查之间的间隔。默认间隔为60秒。
	)

GO的ES查询全部

NewMatchAllQuery

func NewMatchAllQuery() *MatchAllQuery

NewMatchAllQuery creates and initializes a new match all query.【创建并初始化一个新的match all查询。】

Client.Search("索引名称").Query(elastic.NewMatchAllQuery()).Do(context.Background())

GO的ES查询指定起始数据

From(),Size()

From(“起始数据位置”) Size(“这次查询的数据量”) 类似mysql的 offset和limit

Client.Search("索引名称").From(0).Size(2).Do(context.Background())

编写must查询条件的数据

GET 索引名称/_search
{  
   "query": {
    "bool": {
      "must": [
        {
          "range": {
            "follower_num": {
              "gte": "10000"
            }
          }
        },
        {
          "match_phrase": {
            "nickname": "李佳"
          }
        }
      ]
    }
  }
  • NewMatchPhraseQuery 将词分割开来,匹配倒排索引,查找这个短
  • NewRangeQuery 创建一个范围查询
  • NewBoolQuery 创建一个布尔型查询
  • Lt,Lte,Gt,Gte range查询下条件 小于 、小于等于、大于、大于等于
  • Filter 数据过滤查询
  • Must must类型查询相当于mysql的and

查询示例如下,查询字段nickname包含李佳短语的,并且粉丝数小于

boolQ := elastic.NewBoolQuery()
	boolQ.Must(elastic.NewMatchPhraseQuery("nickname", "李佳"))//设置must
 	boolQ.Filter(elastic.NewRangeQuery("follower_num").Lt(10000))
	res, err = client.Search("索引名称").From(0).Size(2).Query(boolQ).Do(context.Background())

BodyJosn

例如:插入一条Person结构体格式的数据到索引【相当于mysql数据库】,type:user_info【相当于mysql的表】中,如果没有这个样的索引类型结构会在es中直接创建

p1 := Person{Name: "lmh", Age: 18, Married: false}
    put1, err := client.Index().
        Index("user").
        Index("user_info").
        BodyJson(p1).
        Do(context.Background())

Update

作用就是用于修改,指定的es数据行,操作如下

res, err := client.Update().
		Index("user").
		Type("user_info").
		Id("1").//指定id数据修改
		Doc(map[string]interface{}{"age": 88}).//需要修改的数据字段
		Do(context.Background())

Delete

作用就是删除指定数据,操作如下

res, err := client.Delete().Index("user").
		Type("user_info").
		Id("1").
		Do(context.Background())

GO的路由设置

  • gin 框架中采用的路由库是基于httprouter做的
r := gin.Default()//初始化路由
 r.GET("/topgoer", helloHandler)  //post请求方式路由,helloHandler是对应的处理函数
 r.POST("/xxxpost",getting) //post请求方式路由,getting是对应的处理函数
 r.PUT("/xxxput") //restful的请求方式,添加数据
 r.Run(":8000")//监听端口默认为8080,启动服务,设置端口号

完整示例如下

package main

import (
    "net/http"  
    "github.com/gin-gonic/gin"
)

func helloHandler(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello www.topgoer.com!",
    })
}

func main() {
    r := gin.Default()
    r.GET("/topgoer", helloHandler)
    if err := r.Run(); err != nil {
        fmt.Println("startup service failed, err:%v\n", err)
    }
}

GO接收参数

GET参数接收

例如:http://localhost:8080/user?name=100

c.DefaultQuery("接收的参数名称", "如果为空指定默认值")  //参数名称   
c.DefaultQuery("name", "andy")  //参数名称

完整示例如下

package main
import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/user", func(c *gin.Context) {
       	name := c.DefaultQuery("name", "枯藤")
        c.JSON(http.StatusOK, gin.H{ //返回json格式数据
            "message": name,
        })
    })
    r.Run()
}
POST表单参数接收

POST方式formdata方式提交的数据

types := c.DefaultPostForm("接收参数名称", "如果为空时默认的值")  //作用是是为postform设置一个一个默认值,如果这个参数没有收到,默认给个post
username := c.PostForm("接收参数名称")

完整示例

package main

import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.POST("/form", func(c *gin.Context) {
        types := c.DefaultPostForm("type", "post")
        username := c.PostForm("username")
        password := c.PostForm("userpassword")
        c.JSON(http.StatusOK, gin.H{ //返回json格式数据
            "username": username,
            "password":password
        })
    })
    r.Run()
}
GO绑定接收JSON数据

客户端传参,后端接收并解析到结构体

c.ShouldBindJSON(&json);//json定义好的结构体

package main

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

// 定义接收数据的结构体
type Login struct {
   // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段
   User    string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
   Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func main() {
   // 1.创建路由
   // 默认使用了2个中间件Logger(), Recovery()
   r := gin.Default()
   // JSON绑定
   r.POST("loginJSON", func(c *gin.Context) {
      // 声明接收的变量
      var jsonData Login
      // 将request的body中的数据,自动按照json格式解析到结构体
      if err := c.ShouldBindJSON(&json); err != nil {
         // 返回错误信息
         // gin.H封装了生成json数据的工具
         c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
         return
      }
       c.JSON(http.StatusBadRequest,jsonData)
   })
   r.Run(":8000")
}