环境

elasticsearch 6.8 (6.x版本应该都没问题)

go客户端sdk: github.com/elastic/go-elasticsearch/v6

其实自己封装api也行,反正elasticsearch对外交互的协议是restful接口

注意点

发起的请求,如果成功了,一定要记得关闭返回Response的Body,否则会占用一个连接。

全局变量和函数

var c *elasticsearch.Client

func init() {
var err error
config := elasticsearch.Config{}
config.Addresses = []string{"http://127.0.0.1:9200"}
c, err = elasticsearch.NewClient(config)
checkError(err)
} func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}

创建索引

func createIndex() {
body := map[string]interface{}{
"mappings": map[string]interface{}{
"test_type": map[string]interface{}{
"properties": map[string]interface{}{
"str": map[string]interface{}{
"type": "keyword", // 表示这个字段不分词
},
},
},
},
}
jsonBody, _ := json.Marshal(body)
req := esapi.IndicesCreateRequest{
Index: "test_index",
Body: bytes.NewReader(jsonBody),
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"acknowledged":true,"shards_acknowledged":true,"index":"test_index"}

删除索引

func deleteIndex() {
req := esapi.IndicesDeleteRequest{
Index: []string{"test_index"},
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"acknowledged":true}

往索引插入数据

插入单条数据

func insertSingle() {
body := map[string]interface{}{
"num": 0,
"v": 0,
"str": "test",
}
jsonBody, _ := json.Marshal(body) req := esapi.CreateRequest{ // 如果是esapi.IndexRequest则是插入/替换
Index: "test_index",
DocumentType: "test_type",
DocumentID: "test_1",
Body: bytes.NewReader(jsonBody),
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[201 Created] {"_index":"test_index","_type":"test_type","_id":"test_1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

批量插入(很明显,也可以批量做其他操作)

func insertBatch() {
var bodyBuf bytes.Buffer
for i := 2; i < 10; i++ {
createLine := map[string]interface{}{
"create": map[string]interface{}{
"_index": "test_index",
"_id": "test_" + strconv.Itoa(i),
"_type": "test_type",
},
}
jsonStr, _ := json.Marshal(createLine)
bodyBuf.Write(jsonStr)
bodyBuf.WriteByte('\n') body := map[string]interface{}{
"num": i % 3,
"v": i,
"str": "test" + strconv.Itoa(i),
}
jsonStr, _ = json.Marshal(body)
bodyBuf.Write(jsonStr)
bodyBuf.WriteByte('\n')
} req := esapi.BulkRequest{
Body: &bodyBuf,
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"took":31,"errors":false,"items":[{"create":{"_index":"test_index","_type":"test_type","_id":"test_2","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_3","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_5","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_6","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_7","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_8","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1,"status":201}},{"create":{"_index":"test_index","_type":"test_type","_id":"test_9","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":3,"_primary_term":1,"status":201}}]}

查询

通过sql查询

func selectBySql() {
query := map[string]interface{}{
"query": "select count(*) as cnt, max(v) as value, num from test_index where num > 0 group by num",
}
jsonBody, _ := json.Marshal(query)
req := esapi.XPackSQLQueryRequest{
Body: bytes.NewReader(jsonBody),
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"columns":[{"name":"cnt","type":"long"},{"name":"value","type":"long"},{"name":"num","type":"long"}],"rows":[[2,7.0,1],[3,8.0,2]],"cursor":"q47zAgFjAQp0ZXN0X2luZGV4igEBAQljb21wb3NpdGUHZ3JvdXBieQEDbWF4Ajg2AAD/AQF2AAAA/wAA/wEAAjc4AQNudW0AAAH/AADoBwEKAQI3OAIAAAAAAAAAAgACAQAAAAABAP////8PAAAAAAEFcmFuZ2U/gAAAAANudW0BAAAAAP8AAAAAAAAAAAAAAAABWgMAAgIAAAAAAAH/////DwMBawI3OAEBWgABbQI4NgV2YWx1ZQAAAVoBawI3OAABWgABBw=="}

通过Search Api查询

func selectBySearch() {
query := map[string]interface{}{
"query": map[string]interface{}{
"bool": map[string]interface{}{
"filter": map[string]interface{}{
"range": map[string]interface{}{
"num": map[string]interface{}{
"gt": 0,
},
},
},
},
},
"size": 0,
"aggs": map[string]interface{}{
"num": map[string]interface{}{
"terms": map[string]interface{}{
"field": "num",
//"size": 1,
},
"aggs": map[string]interface{}{
"max_v": map[string]interface{}{
"max": map[string]interface{}{
"field": "v",
},
},
},
},
},
}
jsonBody, _ := json.Marshal(query) req := esapi.SearchRequest{
Index: []string{"test_index"},
DocumentType: []string{"test_type"},
Body: bytes.NewReader(jsonBody),
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"took":10,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":5,"max_score":0.0,"hits":[]},"aggregations":{"num":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":2,"doc_count":3,"max_v":{"value":8.0}},{"key":1,"doc_count":2,"max_v":{"value":7.0}}]}}}

但是elasticsearch对聚合查询分页并不是很友好,基本上都是得自己手动分页。

局部更新(批量更新略)

根据id更新

func updateSingle() {
body := map[string]interface{}{
"doc": map[string]interface{}{
"v": 100,
},
}
jsonBody, _ := json.Marshal(body)
req := esapi.UpdateRequest{
Index: "test_index",
DocumentType: "test_type",
DocumentID: "test_1",
Body: bytes.NewReader(jsonBody),
} res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"_index":"test_index","_type":"test_type","_id":"test_1","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":3,"_primary_term":1}

除了doc方式之外,还有script方式

根据条件更新

func updateByQuery() {
body := map[string]interface{}{
"script": map[string]interface{}{
"lang": "painless",
"source": `
ctx._source.v = params.value;
`,
"params": map[string]interface{}{
"value": 101,
},
},
"query": map[string]interface{}{
"match_all": map[string]interface{}{},
},
}
jsonBody, _ := json.Marshal(body)
req := esapi.UpdateByQueryRequest{
Index: []string{"test_index"},
Body: bytes.NewReader(jsonBody),
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"took":109,"timed_out":false,"total":9,"updated":9,"deleted":0,"batches":1,"version_conflicts":0,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[]}

删除

根据id删除

func deleteSingle() {
req := esapi.DeleteRequest{
Index: "test_index",
DocumentType: "test_type",
DocumentID: "test_1",
} res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"_index":"test_index","_type":"test_type","_id":"test_1","_version":6,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":7,"_primary_term":1}

根据条件删除

func deleteByQuery() {
body := map[string]interface{}{
"query": map[string]interface{}{
"match_all": map[string]interface{}{},
},
}
jsonBody, _ := json.Marshal(body)
req := esapi.DeleteByQueryRequest{
Index: []string{"test_index"},
Body: bytes.NewReader(jsonBody),
}
res, err := req.Do(context.Background(), c)
checkError(err)
defer res.Body.Close()
fmt.Println(res.String())
}

[200 OK] {"took":17,"timed_out":false,"total":9,"deleted":9,"batches":1,"version_conflicts":0,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[]}

go对elasticsearch的增删改查的更多相关文章

  1. 使用kibana操作elasticsearch实现增删改查

    本篇博客,本人写的是方法,大家将对应的字段放入对应的位置就可以了 注:elasticsearch中,索引相当于MySQL中的数据库,类型相当于数据库中的表,即索引名就为数据库库名,类型就为表名 1.创 ...

  2. ElasticSearch入门-增删改查(java api)

    1.增加Index PutMappingRequest mapping = Requests.putMappingRequest(indices).type(mappingType).source(g ...

  3. Curl实现ElasticSearch的增删改查

    一.添加数据(laravel必须安装Curl扩展) $data = [ 'username'=>"张三", 'sex'=>"女", 'age'=&g ...

  4. elasticsearch增删改查crudp-----1

    Elasticsearch一些增删改查的总结 环境Centos7+Es 5.x 简单介绍下ES的原理: 1,索引  --相当于传统关系型数据库的database或schema 2,类型  --相当于传 ...

  5. kibana的Dev Tool中如何对es进行增删改查

    kinaba Dev Tool中对es(elasticSearch)进行增删改查 一.查询操作 查询语句基本语法 以下语句类似于mysql的: select * from  xxx.yyy.topic ...

  6. Elasticsearch 单模式下API的增删改查操作

    <pre name="code" class="html">Elasticsearch 单模式下API的增删改查操作 http://192.168. ...

  7. 【ES】ElasticSearch初体验之使用Java进行最基本的增删改查~

    好久没写博文了, 最近项目中使用到了ElaticSearch相关的一些内容, 刚好自己也来做个总结. 现在自己也只能算得上入门, 总结下自己在工作中使用Java操作ES的一些小经验吧. 本文总共分为三 ...

  8. elasticsearch实例讲解增删改查

    1.首先弄明白四个概念 elasticsearch 关系型数据库 index 数据库 type 表 document 行 field 字段 如果刚一开始理解比较困难,那你就在心中默念100遍,10遍也 ...

  9. Elasticsearch学习系列之单模式下API的增删改查操作

    这里我们通过Elasticsearch的marvel插件实现单模式下API的增删改查操作 索引的初始化操作 创建索引之前可以对索引进行初始化操作,比如先指定shard数量以及replicas的数量 代 ...

随机推荐

  1. WinDbg命令窗口的使用

    调试器命令窗口是windbg中的主要调试信息窗口.可以在此窗口中输入调试程序命令并查看命令输出.Windbg的命令窗口是我们进行调试时,主要打交道的窗口.界面如下 对于windbg,“调试器命令窗口” ...

  2. [RN] React Native 下实现底部标签(不支持滑动切换)

    底部标签是现在App的基本菜单实现 下面分别用 createBottomTabNavigator 和 createMaterialBottomTabNavigator 两种方法分别实现底部菜单 但此两 ...

  3. 【JZOJ6217】【20190614】最大面积

    题意 平面上有\(n\)个点\(A_i\),\(q\)次询问,每次给出一个点\(P\),求: \[ \sum_{i=L}^{R} 2S_{\triangle OPA_i} \] 最大值,其中$S_{\ ...

  4. 微信小程序音乐播放器组件

    wxml <image bindtap="click" src="{{isPlay?'/images/':'/images/'}}"/> JS Pa ...

  5. 玩家属性同步优化-脏数据标记(位运算、数组、stl之bitset)

    把大神的帖子中一部分摘抄出来,结合自己写的位运算代码和循环代码(数组遍历)进行性能测试分析并给出结果. 摘自: https://www.gameres.com/827195.html 本文适用于所有脏 ...

  6. Java获取两个指定日期之间的所有月份

    String y1 = "2016-02";// 开始时间 String y2 = "2019-12";// 结束时间 try { Date startDate ...

  7. (二)Cisco dhcp snooping配置解释

    #配置dhcp snooping相关命令 Switch(config)#ip dhcp snooping  //打开DHCP Snooping功能Switch(config)#ip dhcp snoo ...

  8. hdoj - 1864 最大报销额

    Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品 ...

  9. 安装docker (centos7.6)

    Docker 更新yum包 sudo yum update 卸载旧版本sudo yum remove docker docker-common docker-selinux docker-engine ...

  10. java正则表达式备忘

    最近框架和爬虫上常要处理字符串匹配和替换的场景,备忘. 非贪婪模式 比如要匹配html文本中的连接,例如a href="www.abc.com/xyz/o"需要替换为a href= ...