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查询全部
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")
}