golang操作elasticsearch(oliver/elastic使用文档)_golang 使用elastic_p1049990866的博客-CSDN博客


本站和网页 https://blog.csdn.net/p1049990866/article/details/117254708 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

golang操作elasticsearch(oliver/elastic使用文档)_golang 使用elastic_p1049990866的博客-CSDN博客
golang操作elasticsearch(oliver/elastic使用文档)
p1049990866
于 2021-05-25 16:12:01 发布
8018
收藏
29
分类专栏:
go
文章标签:
go
elasticsearch
数据库
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/p1049990866/article/details/117254708
版权
go
专栏收录该内容
9 篇文章
0 订阅
订阅专栏
文章目录
1. 版本2. 连接es3. 索引操作3.1 创建索引3.2 判断索引是否存在3.3 更新索引3.4 删除索引3.5 数据迁移3.6 设置别名
4. 数据操作4.1 新增或覆盖数据(单条)4.2 根据id新增或更新数据(单条)4.3 根据id新增或更新数据(批量)4.4 根据条件更新数据4.5 查询
5. 查询条件query设置5.1 一个示例5.2 match 模糊匹配5.3 terms 精确匹配5.4 range 范围匹配5.5 nested 嵌套结构查询5.6 更多
6. script painless语法6.1 变量6.2 if else6.3 for循环6.4 类型转换
7. script 实际应用7.1 更新7.2 自定义排序
1. 版本
示例运行环境: go版本: 1.14 es版本: 6.7.0 工具及版本: github.com/olivere/elastic v6.2.35
此文章适合有go基础的人阅读, 因为代码示例中都是部分代码片段而不是完整可执行代码, 需要自行完善
2. 连接es
options := []elastic.ClientOptionFunc{
elastic.SetURL("http://xxxxxxx:9200"),
elastic.SetSniff(true), //是否开启集群嗅探
elastic.SetHealthcheckInterval(10 * time.Second), //设置两次运行状况检查之间的间隔, 默认60s
elastic.SetGzip(false), //启用或禁用gzip压缩
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)), //ERROR日志输出配置
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)), //INFO级别日志输出配置
options = append(options, elastic.SetBasicAuth(
"xxxx", //账号
"xxxxxxxxxxxxxx", //密码
))
con, err := elastic.NewClient(options...)
下述代码中 conf.ES() 表示con
3. 索引操作
3.1 创建索引
type mi = map[string]interface{}
mapping := mi{
"settings": mi{
"number_of_shards": 3,
"number_of_replicas": 2,
},
"mappings": mi{
"_doc": mi{ //type名
"properties": mi{
"id": mi{ //整形字段, 允许精确匹配
"type": "integer",
},
"name": mi{
"type": "text", //字符串类型且进行分词, 允许模糊匹配
"analyzer": "ik_smart", //设置分词工具
"search_analyzer": "ik_smart",
"fields": mi{ //当需要对模糊匹配的字符串也允许进行精确匹配时假如此配置
"keyword": mi{
"type": "keyword",
"ignore_above": 256,
},
},
},
"date_field": mi{ //时间类型, 允许精确匹配
"type": "date",
},
"keyword_field": mi{ //字符串类型, 允许精确匹配
"type": "keyword",
},
"nested_field": mi{ //嵌套类型
"type": "nested",
"properties": mi{
"id": mi{
"type": "integer",
},
"start_time": mi{ //长整型, 允许精确匹配
"type": "long",
},
"end_time": mi{
"type": "long",
},
},
},
},
},
},
indexName := "xxxxxxxxxxxxxxxxxxxxx" //要创建的索引名
_, err = conf.ES().CreateIndex(indexName).BodyJson(mapping).Do(context.Background())
3.2 判断索引是否存在
//exists true 表示索引已存在
exists, err := conf.ES().IndexExists(indexName).Do(context.Background())
3.3 更新索引
仅支持添加字段, 已有字段无法修改
type mi = map[string]interface{}
mapping := mi{
"properties": mi{
"id": mi{ //整形字段, 允许精确匹配
"type": "integer",
},
},
_, err = conf.ES().PutMapping().
Index(indexName).
Type("_doc").
BodyJson(mapping).
Do(context.Background())
3.4 删除索引
_, err = conf.ES().DeleteIndex(indexName).Do(context.Background())
3.5 数据迁移
将一个索引的数据迁移到另一个索引中, 一般用于索引结构发生改变时使用新索引存储数据
type mi = map[string]interface{}
_, err = conf.ES().Reindex().Body(mi{
"source": mi{
"index": oldIndexName,
},
"dest": mi{
"index": newIndexName,
},
}).Do(context.Background())
3.6 设置别名
设置别名后就可以使用别名查询数据
_, err = conf.ES().Alias().Action(
elastic.NewAliasAddAction(oldIndexName).Index(newIndexName),
).Do(context.Background())
4. 数据操作
4.1 新增或覆盖数据(单条)
此操作相同id的数据会被覆盖
_, err = conf.ES().Index().
Index(indexName).
Type("_doc").
// id为字符串, 创建一条此id的数据或覆盖已有此id的记录
// data为结构体或map, 当然结构需要跟索引的mapping类型保持一致
Id(id).BodyJson(data).
Do(context.Background())
4.2 根据id新增或更新数据(单条)
仅更新传入的字段, 而不是像 4.1 进行整条记录覆盖
_, err = conf.ES().Update().
Index(t.index()).
Type("_doc").
Id(id).
// data为结构体或map, 需注意的是如果使用结构体零值也会去更新原记录
Upsert(data).
// true 无则插入, 有则更新, 设置为false时记录不存在将报错
DocAsUpsert(true).
Do(context.Background())
4.3 根据id新增或更新数据(批量)
bulkRequest := conf.ES().Bulk()
// data map[int]interface{}, key为id, value为要更新的数据
for id, v := range data {
doc := elastic.NewBulkUpdateRequest().
Index(t.index()).
Type("_doc").
Id(strconv.Itoa(id)).
Doc(v).
// true 无则插入, 有则更新, 设置为false时记录不存在将报错
DocAsUpsert(true)
bulkRequest.Add(doc)
bulkResponse, err := bulkRequest.Do(context.Background())
if err != nil {
return
// 获取操作失败的记录
bad := bulkResponse.Failed()
if len(bad) > 0 {
s, _ := jsoniter.MarshalToString(bad)
err = errors.New("部分记录更新失败 " + s)
4.4 根据条件更新数据
_, err = conf.ES().UpdateByQuery().
Index(indexName).
Type("_doc").
//查询条件, 详细配置查询条件请查看章节 5
Query(query).
//要执行的更新操作, 详细配置请查看章节 6及7.1
Script(script).
Do(context.Background())
4.5 查询
_, err = conf.ES().Search().
Index(indexName).
//偏移量
From(0).
//返回数据的条数
Size(10).
//指定返回数据的字段(此处指定返回id和name), 全部返回则无需设置
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("id", "name")).
//查询条件, 详细配置查询条件请查看章节 5
Query(query).
//按照id升序排序, 无需排序则可跳过此设置, 多个Sort会按先后顺序依次生效
Sort("id", true).
//自定义排序规则, 详细写法请查看章节 6及7.2
SortBy(sorter).
Do(context.Background())
5. 查询条件query设置
5.1 一个示例
"bool": {
"filter": [
"nested": {
"path": "nested_field",
"query": {
"range": {
"nested_field.start_time": {
"from": 1581475200,
"include_lower": true,
"include_upper": true,
"to": null
},
"nested": {
"path": "nested_field",
"query": {
"range": {
"nested_field.end_time": {
"from": null,
"include_lower": true,
"include_upper": true,
"to": 1581481440
],
"must": {
"terms": {
"id": [
4181,
4175
实现上述查询条件的go代码如下
query := elastic.NewBoolQuery()
query.Must(elastic.NewTermsQuery("id", []int{4181, 4175}))
query.Filter(elastic.NewNestedQuery(
"nested_field",
// nested_field.start_time >= 1581475200
elastic.NewRangeQuery("nested_field.start_time").Gte(1581475200),
))
query.Filter(elastic.NewNestedQuery(
"nested_field",
// nested_field.start_time <&#61; 1581481440
elastic.NewRangeQuery("nested_field.end_time").Lte(1581481440),
))
5.2 match 模糊匹配
// name字段模糊匹配
elastic.NewMatchQuery("name", val)
5.3 terms 精确匹配
// name字段精确匹配
elastic.NewTermsQuery("name.keyword", val...)
5.4 range 范围匹配
// id >&#61; 10, id <&#61; 100
elastic.NewRangeQuery("id").Gte(10).Lte(100)
5.5 nested 嵌套结构查询
elastic.NewNestedQuery(
"nested_field",
query, //此处query中的字段 都需要加上nested_field前缀, 比如 nested_field.id
5.6 更多
es query中的每一种查询结构都会有一个对应的go结构体, 此处不再过多赘述
6. script painless语法
官方文档
6.1 变量
int index &#61; 1;
6.2 if else
if (index &#61;&#61; -1) {
// 逻辑
} else {
//
6.3 for循环
for (om_cms_id in params.om_cms_ids) {
continue
6.4 类型转换
// 数字转字符串
String.valueOf(11)
7. script 实际应用
7.1 更新
数据库中goods_id与omcms的关联关系存储如下
om_cms_idgoods_id11, 221, 23144
es中goods_id与omcms关联关系存储如下
goods_idom_cms_id1[1, 2, 3]2[1, 2, 4]
当数据库中关联关系发生变换时要对应更新es中数据
获取omcms发生变化的记录删除这些omcms在es中与goods的关联关系添加omcms与goods的新关联关系
var goodsOmCmsIds &#61; make(map[int][]int)
var goodsIds []interface{}
var omCmsIds []interface{}
for _, v :&#61; range list {
omCmsIds &#61; append(omCmsIds, v.Id)
reg :&#61; regexp.MustCompile("^\\d&#43;(,\\d&#43;)*$")
v.Ids &#61; strings.ReplaceAll(v.Ids, "NaN", "0")
if !reg.MatchString(v.Ids) {
fmt.Println("不支持的格式:", v.Ids)
continue
err &#61; jsoniter.UnmarshalFromString("["&#43;v.Ids&#43;"]", &v.GoodsIds)
if err !&#61; nil {
return
for _, goodsId :&#61; range v.GoodsIds {
if goodsId &#61;&#61; 0 {
continue
if _, ok :&#61; goodsOmCmsIds[goodsId]; !ok {
goodsIds &#61; append(goodsIds, goodsId)
goodsOmCmsIds[goodsId] &#61; append(goodsOmCmsIds[goodsId], v.Id)
// 查询出omcsm变更导致可能发生变更的所有商品
query :&#61; NewBoolQuery().Should(
NewBoolQuery().Must(elastic.NewTermsQuery("id", goodsIds...)),
NewBoolQuery().Must(elastic.NewTermsQuery("om_cms_id", omCmsIds...)),
script :&#61; elastic.NewScript(&#96;
for (om_cms_id in params.om_cms_ids) {
if (ctx._source.om_cms_id &#61;&#61; null) {
continue
int index &#61; ctx._source.om_cms_id.indexOf(om_cms_id);
if (index &#61;&#61; -1) {
continue
ctx._source.om_cms_id.remove(index);
if (params.goods_om_cms_ids &#61;&#61; null || params.goods_om_cms_ids[ctx._id] &#61;&#61; null) {
return
for (om_cms_id in params.goods_om_cms_ids[ctx._id]) {
if (ctx._source.om_cms_id &#61;&#61; null) {
ctx._source.om_cms_id &#61; [om_cms_id]
} else {
ctx._source.om_cms_id.add(om_cms_id)
&#96;).Params(map[string]interface{}{
"goods_om_cms_ids": goodsOmCmsIds,
"goods_ids": goodsIds,
"om_cms_ids": omCmsIds,
})
// 使用4.4更行方法
7.2 自定义排序
根据传入的id顺序排序
m :&#61; make(map[string]interface{})
// 循环要查询的id, 并转成map, key是id值, value是在原数组种的索引
for index, goodsId :&#61; range ids {
m[strconv.Itoa(goodsId)] &#61; index
sort :&#61; elastic.NewScriptSort(
// params 存储自定义数据
// doc 表示当前记录
elastic.NewScript(&#96;
params.id[String.valueOf(doc['id'].value)]
&#96;).Param("id", m),
"number",
).Order(vv[0] &#61;&#61; 1)
p1049990866
关注
关注
13
点赞
29
收藏
打赏
知道了
评论
golang操作elasticsearch(oliver/elastic使用文档)
文章目录1. 版本2. 连接es3. 索引操作3.1 创建索引3.2 判断索引是否存在3.3 更新索引3.4 删除索引3.5 数据迁移3.6 设置别名4. 数据操作4.1 新增或覆盖数据(单条)4.2 根据id新增或更新数据(单条)4.3 根据id新增或更新数据(批量)4.4 根据条件更新数据4.5 查询5. 查询条件query设置5.1 一个示例match 模糊匹配terms 精确匹配range 范围匹配nested 嵌套结构查询更多6. script painless语法6.1 变量6.2 if els
复制链接
扫一扫
专栏目录
ElasticSearch分布式搜索引擎 v7.9.0
11-04
为您提供ElasticSearch分布式搜索引擎下载,Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎,能够解决越来越多的用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。Elasticsearch是一个实时的分布式搜索分析引擎,它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这几个功能的组合:1、Wikipedia使用El
Go-elasticsearchloggolang的elasticsearch日志封装包括搜索查询添加等
08-14
elasticsearch log golang 的elasticsearch 日志封装,包括搜索,查询,添加等
评论 6
您还未登录,请先
登录
后发表或查看评论
go-elasticsearch 官方包操作合集
最新发布
m0_46937429的博客
02-24
63
【代码】go-elasticsearch 官方包操作合集。
go语言使用olivere/elastic es客户端实现SearchAfter深度分页
nO0b
05-12
3109
我们go项目里使用的es客户端是olivere/elastic包,资料比较少,SearchAfter的实现更是少,所以记录下来给有缘人,也给记性差的自己。
关于深度分页、浅分页的区别优缺点另行了解,我的es版本是6.4,过低版本会不支持
关于SearchAfter官方的简单实例
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-request-search-after.html
简单演示下客户端的创建:
impo
Go Elasticsearch 增删改查(CRUD)快速入门
m0_67400973的博客
04-18
2575
文章目录
1.入门简介
2.客户端库
3.创建客户端
4.index 增删改查
5.增加
6.删除
7.修改
8.查询
9.小结
参考文献
1.入门简介
Elasticsearch 入门简介
2.客户端库
ES 的 Go 客户端较为流行的有 Elastic 公司官方库go-elasticsearch 和第三方库 olivere/elastic,后者较为流行。
因项目中使用的是 olivere/elastic/v7,所以本文将介绍通过该库完成对 ES 的增删改查。
注意,ES 不同版本需要使用对应版本的.
elastic golang
weixin_42248522的博客
06-22
419
如果 插入es的BodyJson大于32766(utf-8),需要使用mapping创建
【Elasticsearch系列之四】腾讯云ES数据基本操作
使用Elasticsearch(附Golang代码)
迁移到es使用上遇到的问题
elasticsearch如何修改mapping和template的方法
修改mapping之前,要把数据都清理掉,不然你就算put了新的mapping,他以前的数据也更正不过来,后进去的数据会跟随旧数据的存储类型
注意:索引模板仅在索引创建时应用,因此模板调整不会对已有的.
golang es设置index max_result_window
guoguangwu的专栏
10-21
839
es index
golang常用库之olivere elastic包 | go操作elasticsearch
西京刀客
08-04
1542
Elastic是GO编程语言的Elasticsearch的客户端。自2012年以来,我们在生产中使用它。它支持Elasticsearch版本1.x,2.x,5.x,6.x和7.x。
Elasticsearch:Script fields 及其调试
Elastic 中国社区官方博客
04-14
4730
在之前的文章 &ldquo;Elasticsearch:从搜索中获取选定的字段&rdquo;,我有讲到过一些关于 script fields 的话题。在今天的文章中,我想就这个话题更进一步地详述。在搜索时,每个 _search 请求的匹配(hit)可以使用 script_fields(基于不同的字段)定制一些属性。这些定制的属性(script fields)通常是:
针对原有值的修改(比如,价钱的转换,不同的排序方法等)
一个崭新的及算出来的属性(比如,总和,加权,指数运算,距离测量等)
一个 _search 请求能定义多于.
Golang 操作Elastic进行插入数据,查询与模糊查询
qq_42690129的博客
07-07
1036
Golang 操作Elastic进行插入数据,查询与模糊查询
Elasticsearch:Elasticsearch 开发入门 - Golang
Elastic 中国社区官方博客
12-24
2362
在本文中,我将分享如何在 Golang 中如何使用Elasticsearch 来开发的经验。 顺便说一句,以防万一你从未听说过 Elasticsearch:
Elasticsearch 是一个高度可扩展的开源全文本搜索和分析引擎。 它使你可以快速,近乎实时地存储,搜索和分析大量数据。 它通常用作支持具有复杂搜索功能和要求的应用程序的基础引擎/技术。
如果你想了解更多关于 Elasticsearch 的介绍,你可以参阅我之前的文章 &ldquo;Elasticsearch 简介&rdquo;。
针对 Golang 的 E.
elasticsearch golang的sdk使用
weixin_34336526的博客
04-28
1270
文档第一
《elasticsearch权威指南》直接看官网在线版的,比较新,网上那些pdf版的,都是2.x版的,许多不兼容
官方API手册,可以选择版本。
golang sdk库的选择
主要有以下两个
github.com/olivere/elastic 第三方开发,各个版本都有对应的sdk,文档也丰富
github.com/elastic/go-elasticsearch 不做评论
最终我们选...
Golang操作elasticsearch(一)
weixin_33695082的博客
01-25
3219
Golang操作elasticsearch
使用第三方包:olivere github。总结一下olivere操作ES的常用功能,方便查阅。
说明:以下例子用到的es index:"test", es type:"test", es address: "http://10.1.1.1:9200"
新建es client
func...
doc es 中type_es 搜索数据 分词
weixin_34137975的博客
12-19
332
总结1、能中文分词,安装ik插件,阿里云es默认就带有2、获取词频https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html#docs-termvectorshttps://www.elastic.co/guide/en/elasticsearch/reference/curr...
golang中使用elasticsearch之olivere elastic汇总
Xiao_W_u的博客
07-19
3788
golang中使用elasticsearch之olivere elastic汇总
简介
olivere elastic作为golang比较常用的elasticsearch工具包,接下来我将讲解如何使用。
有兴趣的可以去看一下:olivere elastic 官方源码
1.版本
go get github.com/olivere/elastic/v7
2.客户端连接
func init(){
client, err = elastic.NewClient(
elastic.SetSniff(fa
Golang使用Elasticsearch
m0_67391870的博客
03-25
1473
创建es.go文件
根据elasticsearch版本拉取对应的go包:github.com/elastic/go-elasticsearch
API文档:https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6@v6.8.5/esapi?tab=doc
package es
import (
"bytes"
"context"
"encoding/json"
"fmt"
"github.com/elastic/go-elasticsea
Day 4 - PB级规模数据的Elasticsearch分库分表实践
starzhou的专栏
02-17
571
Day 4 - PB级规模数据的Elasticsearch分库分表实践
从2018年7月在开始在某阿里云数据中心部署Elasticsearch软件,到2018年12月共创建了15个集群,服务于客户的文档检索、交通视频检索、地理信息检索、日志安全审计等业务。其中数据规模最大的一个业务,共有800张表,7万亿条数据,每天新增500亿条记录,数据要求存储半年,单条记录大小1KB左右,存储规模约1...
原来 Elasticsearch 还可以这么理解
MarkerHub的博客
02-23
252
来源:cnblogs.com/jajian/p/11223992.html生活中的数据先说说Lucen核心概念基本使用性能优化存储设备内部索引优化调整配置参数JVM调优由于近期在公司内部做...
golang中使用elasticsearch
fitzleopard的博客
05-27
1517
本文首发于我的个人博客
这是一篇介绍如何利用golang第三方库https://github.com/olivere/elastic进行elasticsearch的操作的文章。
文章中并不会介绍非常详细的API,更侧重于作者在工作中的使用经验和查文档经验。文章中主要包括以下内容:
作者认为比较重要的API设计理念以及文档查阅方式
作者在工作中使用到的elasticsearch的实例,包括从接到需求,查阅文档,并实现的过程
API设计理念思考
API的分类
在使用elasticsearch的golang
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
p1049990866
CSDN认证博客专家
CSDN认证企业博客
码龄7年
北京中公教育科技有限公司
51
原创
8万+
周排名
15万+
总排名
4万+
访问
等级
861
积分
12
粉丝
42
获赞
36
评论
130
收藏
私信
关注
热门文章
golang操作elasticsearch(oliver/elastic使用文档)
8011
树形结构的数据库表设计
5029
python库--pandas--DataFrame--替换/填充/新增
4214
python库--pandas--DataFrame--初始化数据
3745
gohbase使用说明
2718
分类专栏
数据结构
1篇
elasticsearch
3篇
k8s系列
2篇
docker
8篇
python入门系列
9篇
web服务
1篇
深度学习--pytorch
2篇
vue
1篇
mysql
7篇
python
8篇
pandas
5篇
nlp
1篇
算法
1篇
go
9篇
最新评论
golang操作elasticsearch(oliver/elastic使用文档)
p1049990866:
加字段是可以随意加的
golang操作elasticsearch(oliver/elastic使用文档)
风吹北大荒:
你好 想问一下想在已有索引上面加一个@timestamp用作时间序列可以吗
golang给变量设置默认值
chjiyun:
666
golang操作elasticsearch(oliver/elastic使用文档)
p1049990866:
不清楚
golang操作elasticsearch(oliver/elastic使用文档)
长着翅膀的乌龟:
你好 请问连接es的时候可以设置长连接吗
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
IEEE-754标准float类型在内存中的存储原理
基于olivere/elastic go结构体转es查询
k8s资源管理
2022年2篇
2021年25篇
2020年17篇
2019年7篇
目录
目录
分类专栏
数据结构
1篇
elasticsearch
3篇
k8s系列
2篇
docker
8篇
python入门系列
9篇
web服务
1篇
深度学习--pytorch
2篇
vue
1篇
mysql
7篇
python
8篇
pandas
5篇
nlp
1篇
算法
1篇
go
9篇
目录
评论 6
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
p1049990866
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值