go对接elasticsearch

一、elasticserch请求规范 RESTful

1.请求连接url:http://192.168.10.11:9200///[]

ip是es服务ip,端口根据服务器默认或其他,

index相当于 mysql的数据库

type相当于mysql的表

id相当于行主键id,id是可选的,es会自动生成

2.请求RestFull风格:http请求(head头:Content-Type:application/json),发送方法

查询: get

新增:put、post

修改:put、post

删除:delete

3.比如我们要存储学生的信息到elasticsearch中,

index----school_1 学校

type----class_1 班级

id---- 学生id

学生信息json格式:

{
    "name":"somebody",
    "age":18,
    "like":"xoxo",
}

http://192.168.10.11:9200/school_1/class_1/1 GET请求:查询某学校某班级一个id为1的学生信息

http://192.168.10.11:9200/school_1/class_1/_search GET请求:查询某学校某班级所有学生的信息

http://192.168.10.11:9200/school_1/class_1/n PUT请求:新增学生 ,需要body传新增的json数据

修改也可以用新增方式请求将数据覆盖达到修改效果。

http://192.168.10.11:9200/school_1/class_1/1 DELETE请求; 删掉一个数据

http://192.168.10.11:9200/school_1/class_1/_search GET请求:查看某学校某班级所有学生数据

http://192.168.10.11:9200/school_1/class_1/1?_source=name,like  GET请求:查看某个学生名称和喜好

二、elasticsearch返回结果集,各字段代表什么意思

获得的结果需要从这个结构中层层解析获得

"took" : 48,  -------------------->  took表示Elasticsearch执行搜索所用的时间,单位是毫秒。

"timed_out" : false,  --------------->  指示搜索是否超时

"_shards" : { --------------------->  _shards 指示搜索了多少分片,以及搜索成功和失败的分片的计数

    "total" : 1,

    "successful" : 1,

    "skipped" : 0,

    "failed" : 0 

}

"hits" : { ------------------------>  hits 用来实际搜索结果集

      "total" :  -------------------->  本次搜索返回多少条结果

      "max_score": ---------------->  本次搜索中 最大的相关分数

      "hits": [---------------------->  默认查询前10数据  查询完整的数据  以_source降序排序

          {

               "_index": "attacker_log_2019-10",  -------->  索引

               "_type": ---------------------------->  属性

               "_id": ------------------------------>  索引数据id

               "_score":

               "_source": {  ------------------------>  结果原数据

                      "xxxxxx": 

                      "yyyyyy":

                      "zzzzzz": 

               }

          }

      "aggerations": ---------------------------->  查询分类聚合数据

三、golang连接elasticsearch

我服务器装的elasticsearch 版本是 7.x.x版本,所以包是对应v7版本

github.com/olivere/elastic/v7

如下,获得连接服务器的 client实例

package es

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

var Client *elastic.Client
var host = "http://192.168.10.11:9200"

//初始化
func InitClient() {
	//errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
	var err error
	//初始化客户端
	Client, err = elastic.NewClient(
		elastic.SetSniff(false),
		elastic.SetURL(host),
		)
	if err != nil {
		panic(err)
	}
	//连接服务测试
	_, _, err = Client.Ping(host).Do(context.Background())
	if err != nil {
		panic(err)
	}
	//fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
	//获取服务端版本号
	_, err = Client.ElasticsearchVersion(host)
	if err != nil {
		panic(err)
	}
	//fmt.Printf("Elasticsearch version %s\n", esversion)
}

四、golang调用进行增删改查

1.定义 数据结构

package main

import (
	"context"
	"encoding/json"
	"es/es"
	"fmt"
	"github.com/olivere/elastic/v7"
	"reflect"
)

var client *elastic.Client
var Index  = "school_1"
var Type  = "class_1"

func init()  {
	es.InitClient() //初始化client
	client = es.Client
}

//Person 数据结构体
type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Like string `json:"like"`
}

2.新增数据

新增的数据可以以结构体方式和json字符串方式,BodyJosn()方法会转接数据

//添加一条数据
func addPerson() {
	//添加数可以用结构体方式和 json字符串方式
	p := Person{"张良",25,"围棋"}
	//p := `{"name":"张良","age":25,"like":"围棋"}`
	put,err := client.Index().Index(Index).Type(Type).Id("1").BodyJson(p).Do(context.Background())
	if err != nil {
		panic(err)
	}
	fmt.Printf("indexed %s --- index %s --- type %s \n",put.Id,put.Index,put.Type)
}
func main() {
	addPerson()
}

go对接elasticsearch_第1张图片

 3.根据id获取一条数据

//查找一条数据
func gets() {
	//通过id查找
	get1, err := client.Get().Index(Index).Type(Type).Id("1").Do(context.Background())
	if err != nil {
		panic(err)
	}
	if get1.Found {
		//fmt.Printf("Got document %s in version %d from index %s, type %s\n", get1.Id, get1.Version, get1.Index, get1.Type)
		var p Person
		err := json.Unmarshal(get1.Source, &p) //将结果集中的数据映射到结构体中
		if err != nil {
			fmt.Println(err)
		}
		fmt.Println(p)
		//fmt.Println(string(get1.Source))
	}
}
func main() {
	gets()
}

4.修改一条数据

//修改
func updateP() {
	up,err := client.Update().Index(Index).Type(Type).Id("1").
		Doc(map[string]interface{}{"name":"史泰龙"}).
		Do(context.Background())
	if err != nil {
		panic(err)
	}
	fmt.Printf("indexed %s --- index %s --- type %s \n",up.Id,up.Index,up.Type)
}

func main() {
	updateP()
}

5.删除一条数据

//删除一条
func deleteP() {
	d,err := client.Delete().
		Index(Index).Type(Type).Id("1").Do(context.Background())
	if err != nil {
		panic(err)
	}
	fmt.Printf("indexed %s --- index %s --- type %s \n",d.Id,d.Index,d.Type)
}

func main() {
	deleteP()
}

6.查询所有数据

//查询所有数据
func query2() {
	var res *elastic.SearchResult
	var err error
	res,err = client.Search(Index).Type(Type).Do(context.Background())
	if err != nil {
		panic(err)
	}
	num := res.Hits.TotalHits.Value //搜索到结果总条数
	if num > 0 {
		for _,hit := range res.Hits.Hits {
			var p Person
			err = json.Unmarshal(hit.Source,&p)
			if err != nil {
				panic(err)
			}
			fmt.Printf(" name : %s --- age : %d --- like : %s",p.Name,p.Age,p.Like)
		}
	}
}
func main() {
	query2()
}

7,条件查询,某个字段包含某个词的数据

//条件查询多条数据,某个字段包含某个词
func query3() {
	var res *elastic.SearchResult
	var err error
	q := elastic.NewQueryStringQuery("name:张")
	res,err = client.Search(Index).Type(Type).Query(q).Do(context.Background())
	if err != nil {
		panic(err)
	}
	num := res.Hits.TotalHits.Value //搜索到结果总条数
	if num > 0 {
		for _,hit := range res.Hits.Hits {
			var p Person
			err = json.Unmarshal(hit.Source,&p)
			if err != nil {
				panic(err)
			}
			fmt.Printf(" name : %s --- age %d \n",p.Name,p.Age)
		}
	}
}
func main() {
	query3()
}

8.多条件查询,某字段包含某词且年龄小于32的

//带条件的查询多条数据
func query4() {
	var res *elastic.SearchResult
	var err error
	q := elastic.NewBoolQuery()
	q.Must(elastic.NewMatchQuery("name","张"))
	q.Filter(elastic.NewRangeQuery("age").Lt(32)) //小于30岁
	res,err = client.Search(Index).Type(Type).Query(q).Do(context.Background())
	if err != nil {
		panic(err)
	}
	num := res.Hits.TotalHits.Value //搜索到结果总条数
	if num > 0 {
		for _,hit := range res.Hits.Hits {
			var p Person
			err = json.Unmarshal(hit.Source,&p)
			if err != nil {
				panic(err)
			}
			fmt.Printf(" name : %s --- age %d \n",p.Name,p.Age)
		}
	}
}

func main() {
	query4()
}

9.某字段包含某词的

//查询某字段中包含 xxx词的数据
func query5() {
	var res *elastic.SearchResult
	var err error
	q := elastic.NewMatchPhraseQuery("name","仪")
	res,err = client.Search(Index).Type(Type).Query(q).Do(context.Background())
	if err != nil {
		panic(err)
	}
	num := res.Hits.TotalHits.Value //搜索到结果总条数
	if num > 0 {
		for _,hit := range res.Hits.Hits {
			var p Person
			err = json.Unmarshal(hit.Source,&p)
			if err != nil {
				panic(err)
			}
			fmt.Printf(" name : %s --- age %d \n",p.Name,p.Age)
		}
	}
}

func main() {
	query5()
}

10,分页查询

//分页
func query6(size int,page int) {
	var res *elastic.SearchResult
	var err error
	res,err = client.Search(Index).Type(Type).Size(size).From((page-1)*size).Do(context.Background())
	if err != nil {
		panic(err)
	}
	num := res.Hits.TotalHits.Value //搜索到结果总条数
	if num > 0 {
		for _,hit := range res.Hits.Hits {
			var p Person
			err = json.Unmarshal(hit.Source,&p)
			if err != nil {
				panic(err)
			}
			fmt.Printf(" name : %s --- age %d \n",p.Name,p.Age)
		}
	}
}

func main() {
	query6(2,1)
}

你可能感兴趣的:(elasticsearch,go)