Es版本 7.0
注意:7.0以后es不再支持指定索引
Es代码如下:
main.go
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/olivere/elastic/v7"
)
var client *elastic.Client
var host = "http://127.0.0.1:9200/"
type TweetUser struct {
User string `json:"user"`
Message string `json:"message"`
}
//初始化
func init() {
var err error
// 将sniff设置为false后,便不会自动转换地址,默认开启
client, err = elastic.NewClient(elastic.SetURL(host), elastic.SetSniff(false))
if err != nil {
panic(err.Error())
}
info, code, err := client.Ping(host).Do(context.Background())
if err != nil {
panic(err.Error())
}
fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
// 获取ES版本信息
esversion, err := client.ElasticsearchVersion(host)
if err != nil {
panic(err.Error())
}
fmt.Printf("Elasticsearch version %s\n", esversion)
}
// 创建索引,并映射
func createIndex(indexName string, mapping interface{}, ctx context.Context) {
// 检查Index是否存在,如果不存在就创建一个
exists, err := client.IndexExists(indexName).Do(ctx)
if err != nil {
panic(err.Error())
}
if !exists {
createIndex, err := client.CreateIndex(indexName).BodyJson(mapping).Do(ctx)
if err != nil {
panic(err.Error())
}
if !createIndex.Acknowledged { // Acknowledged=true代表成功
panic(err.Error())
}
fmt.Printf("createIndex= %v", createIndex)
}
}
// 向索引中插入数据(数据格式有多种比如:BodyJson/BodyString)
func createData(index, indexType string, bodyJson interface{}, ctx context.Context) {
//写入json数据
// put1, err := client.Index().Index(index).Type(indexType).BodyJson(bodyJson).Do(ctx) // 7.0之前的用法
put1, err := client.Index().Index(index).BodyJson(bodyJson).Do(ctx)
if err != nil {
panic(err.Error())
}
fmt.Printf("Indexed TweetUser %s to index %s, type %s\n, result %s\n", put1.Id, put1.Index, put1.Type, put1.Result)
}
// 获取指定id的数据
func getData(index, indexType, id string, ctx context.Context) {
var twitterStruct TweetUser
// 查询数据
// get1,err:=client.Get().Index(index).Type(indexType).Id(id).Do(ctx) // 7.0之前的用法
get1, err := client.Get().Index(index).Id(id).Do(ctx)
if err != nil {
panic(err.Error())
}
if get1.Found {
jsonByte, err := get1.Source.MarshalJSON()
if err != nil {
panic(err.Error())
}
if err = json.Unmarshal(jsonByte, &twitterStruct); err != nil {
panic(err.Error())
}
fmt.Println("id=%s 的数据为:%v =", id, twitterStruct)
fmt.Printf("Got document %s in version %d from index %s, type %s, fields %s\n", get1.Id, get1.Version, get1.Index, get1.Type, get1.Fields)
}
}
// 删除索引index
func delIndex(index string, ctx context.Context) {
deleteIndex, err := client.DeleteIndex(index).Do(ctx)
if err != nil {
panic(err)
}
if !deleteIndex.Acknowledged { // 说明插入成功
// Not acknowledged
}
}
func main() {
// 执行方法
}
main_test.go
package main
import (
"context"
"testing"
)
// v7不在支持指定索引,默认为"_doc"
const mapping = `
{
"settings":{
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings":{
"properties":{
"user":{
"type":"keyword"
},
"message":{
"type":"text",
"store": true,
"fielddata": true
}
}
}
}`
var index="twitter_es_7x"
var indexType="_doc"
func TestCreateIndex(t *testing.T) {
createIndex(index,mapping,context.Background())
}
func TestCreateData(t *testing.T) {
tweet1Json := TweetUser{User: "olivere_2", Message: "Take Five_2"}
createData(index,indexType,tweet1Json,context.Background())
}
func TestGetData(t *testing.T) {
id:="dxWUsXIBmE9X-pmeZU0z"
getData(index,indexType,id,context.Background())
}
func TestDelIndex(t *testing.T) {
delIndex(index,context.Background())
}
go.mod:
module Exercise/ItemEs7x
go 1.14
require github.com/olivere/elastic/v7 v7.0.17
Kibana:
控制台界面路径:http://localhost:5601/app/kibana#/dev_tools/console
// 获取index=twitter_es_7x下的所有数据
GET twitter_es_7x/_search
POST twitter_es_7x/_doc
{
"user":"user-test",
"message":"插入数据,自动生成id"
}
POST twitter_es_7x/_doc/1
{
"user":"user-test2",
"message":"插入数据,自定义id"
}
PUT twitter_es_7x/_doc/1
{
"user":"user-test2",
"message":"更新id=1的数据"
}
参考:
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/multi-fields.html
https://github.com/olivere/elastic