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请求:查看某个学生名称和喜好
获得的结果需要从这个结构中层层解析获得
"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": ----------------------------> 查询分类聚合数据
我服务器装的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)
}
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()
}
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)
}