Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go操作elasticsearch示例

go操作elasticsearch示例

原创
作者头像
孤烟
发布于 2022-03-19 07:13:16
发布于 2022-03-19 07:13:16
2.2K0
举报
文章被收录于专栏:golang开发笔记golang开发笔记

这里我使用elasticsearch官方给的go语言包([go-elasticsearch](https://github.com/elastic/go-elasticsearch))

go-elasticsearch向前兼容,这意味着客户端支持与更大或同等次要版本的 Elasticsearch 通信。Elasticsearch 语言客户端仅向后兼容默认发行版,不提供任何保证。

- 包:https://github.com/elastic/go-elasticsearch

- Elasticsearch 权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

### 环境介绍:

版本

Elasticsearch:v7.15

### 安装

go.mod 文件中添加

```

require github.com/elastic/go-elasticsearch/v8 main

```

或者

````

git clone --branch main https://github.com/elastic/go-elasticsearch.git $GOPATH/src/github.com/elastic/go-elasticsearch

````

### 示例:

新建 es.go 存入 es目录

````

package es

import (

"bytes"

"context"

"encoding/json"

"fmt"

"github.com/elastic/go-elasticsearch/v8"

"github.com/elastic/go-elasticsearch/v8/esapi"

"log"

"net/http"

)

var EsClient *elasticsearch.Client

func init() {

cfg := elasticsearch.Config{

Addresses: []string{

"http://localhost:9200",

},

}

var err erro

EsClient, err = elasticsearch.NewClient(cfg)

if err != nil {

log.Fatalln("Failed to connect to es")

}

}

func failOnError(err error, msg string) {

if err != nil {

log.Fatalf("%s: %s", msg, err)

}

}

// idx 为空,默认随机唯一字符串

func Index(index, idx string, doc map[string]interface{}) {

//index:="my_index_name_v1"

res, err := EsClient.Info()

fmt.Println(res, err)

if err != nil {

log.Fatalf("Error getting response: %s", err)

}

var buf bytes.Buffe

//doc := map[string]interface{}{

// "title": "中国",

// "content": "中国早日统一台湾",

// "time": time.Now().Unix(),

// "date": time.Now(),

//}

if err = json.NewEncoder(&buf).Encode(doc); err != nil {

fmt.Println(err, "Error encoding doc")

return

}

res, err = EsClient.Index(

index, // Index name

&buf, // Document body

EsClient.Index.WithDocumentID(idx), // Document ID

// Document ID

EsClient.Index.WithRefresh("true"), // Refresh

)

//res, err = EsClient.Create(index, idx, &buf)

if err != nil {

fmt.Println(err, "Error create response")

}

defer res.Body.Close()

fmt.Println(res.String())

log.Println(res)

}

//struct 类型允许使用更实际的方法,您可以在其中创建一个新结构,将请求配置作为字段,并使用上下文和客户端作为参数调用 Do() 方法:

func IndexEspi(index, idx string, doc map[string]interface{}) {

//index:="my_index_name_v1"

res, err := EsClient.Info()

fmt.Println(res, err)

if err != nil {

log.Fatalf("Error getting response: %s", err)

}

var buf bytes.Buffe

//doc := map[string]interface{}{

// "title": "中国",

// "content": "中国早日统一台湾",

// "time": time.Now().Unix(),

// "date": time.Now(),

//}

if err = json.NewEncoder(&buf).Encode(doc); err != nil {

fmt.Println(err, "Error encoding doc")

return

}

req := esapi.IndexRequest{

Index: index, // Index name

Body: &buf, // Document body

DocumentID: idx, // Document ID

Refresh: "true", // Refresh

}

res, err = req.Do(context.Background(), EsClient)

if err != nil {

log.Fatalf("Error getting response: %s", err)

}

defer res.Body.Close()

fmt.Println(res.String())

log.Println(res)

}

func Search(index string, query map[string]interface{}) {

res, err := EsClient.Info()

if err != nil {

fmt.Println(err, "Error getting response")

}

//fmt.Println(res.String())

// search - highlight

var buf bytes.Buffe

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match": map[string]interface{}{

// "title": title,

// },

// },

// "highlight": map[string]interface{}{

// "pre_tags": []string{"<font color='red'>"},

// "post_tags": []string{"</font>"},

// "fields": map[string]interface{}{

// "title": map[string]interface{}{},

// },

// },

//}

if err := json.NewEncoder(&buf).Encode(query); err != nil {

fmt.Println(err, "Error encoding query")

}

// Perform the search request.

res, err = EsClient.Search(

EsClient.Search.WithContext(context.Background()),

EsClient.Search.WithIndex(index),

EsClient.Search.WithBody(&buf),

EsClient.Search.WithTrackTotalHits(true),

EsClient.Search.WithFrom(0),

EsClient.Search.WithSize(10),

EsClient.Search.WithSort("time:desc"),

EsClient.Search.WithPretty(),

)

if err != nil {

fmt.Println(err, "Error getting response")

}

defer res.Body.Close()

fmt.Println(res.String())

}

//删除 index 根据 索引名 id

func Delete(index, idx string) {

//index:="my_index_name_v1"

res, err := EsClient.Info()

fmt.Println(res, err)

if err != nil {

log.Fatalf("Error getting response: %s", err)

}

res, err = EsClient.Delete(

index, // Index name

idx, // Document ID

EsClient.Delete.WithRefresh("true"),

)

if err != nil {

fmt.Println(err, "Error create response")

}

defer res.Body.Close()

fmt.Println(res.String())

log.Println(res)

}

func DeleteByQuery(index []string, query map[string]interface{}) {

res, err := EsClient.Info()

if err != nil {

fmt.Println(err, "Error getting response")

}

//fmt.Println(res.String())

// search - highlight

var buf bytes.Buffe

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match": map[string]interface{}{

// "title": title,

// },

// },

// },

//}

if err := json.NewEncoder(&buf).Encode(query); err != nil {

fmt.Println(err, "Error encoding query")

}

// Perform the search request.

res, err = EsClient.DeleteByQuery(

index,

&buf,

)

if err != nil {

fmt.Println(err, "Error getting response")

}

defer res.Body.Close()

fmt.Println(res.String())

}

func SearchEsapiSql(query map[string]interface{}) {

jsonBody, _ := json.Marshal(query)

req := esapi.SQLQueryRequest{Body: bytes.NewReader(jsonBody)}

res, _ := req.Do(context.Background(), EsClient)

defer res.Body.Close()

fmt.Println(res.String())

}

func SearchHttp(method, url string, query map[string]interface{}) {

jsonBody, _ := json.Marshal(query)

req, _ := http.NewRequest(method, url, bytes.NewReader(jsonBody))

req.Header.Add("Content-type", "application/json")

res, err := EsClient.Perform(req)

if err != nil {

return

}

defer res.Body.Close()

buf := new(bytes.Buffer)

buf.ReadFrom(res.Body)

fmt.Println(buf.String())

}

````

新建 main.go

````

package main

import "demo/es"

func main() {

index := "my_index_name_v4"

//创建索引并设置映射

//query := map[string]interface{}{

// "mappings": map[string]interface{}{

// "properties": map[string]interface{}{

// "title": map[string]interface{}{

// "type": "text",

// },

// "content": map[string]interface{}{

// "type": "text",

// },

// "location": map[string]interface{}{

// "type": "geo_point",

// },

// "time": map[string]interface{}{

// "type": "long",

// },

// "date": map[string]interface{}{

// "type": "date",

// },

// "age": map[string]interface{}{

// "type": "keyword",

// },

// },

// },

//}

//url := index

//注意 映射信息不能更新

//es.SearchHttp("PUT", url, query)

//添加或修改文档,没有索引创建

//doc := map[string]interface{}{

// "title": "你好",

// "content": "中国美丽的城市",

// "location": "41.015, -75.011",

// "time": time.Now().Unix(),

// "date": time.Now(),

// "age": 20,

//}

//es.Index(index, "", doc)

//es.IndexEspi(index, "idx5", doc)

//删除索引

//es.Delete(index, "idx3")

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match": map[string]interface{}{

// "title": "vvvvv我爱你!!!!",

// },

// },

//}

//indexArr := []string{index}

//es.DeleteByQuery(indexArr, query)

////搜索单个字段

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match": map[string]interface{}{

// "title": "我爱你中国",

// },

// },

// "highlight": map[string]interface{}{

// "pre_tags": []string{"<font color='red'>"},

// "post_tags": []string{"</font>"},

// "fields": map[string]interface{}{

// "title": map[string]interface{}{},

// },

// },

//}

//搜索多个字段

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "multi_match": map[string]interface{}{

// "query": "中国",

// "fields": []string{"title", "content"},

// },

// },

// "highlight": map[string]interface{}{

// "pre_tags": []string{"<font color='red'>"},

// "post_tags": []string{"</font>"},

// "fields": map[string]interface{}{

// "title": map[string]interface{}{},

// },

// },

//}

//提高某个字段权重,可以使用 ^ 字符语法为单个字段提升权重,在字段名称的末尾添加 ^boost ,其中 boost 是一个浮点数:

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "multi_match": map[string]interface{}{

// "query": "中国",

// "fields": []string{"title", "content^2"},

// },

// },

// "highlight": map[string]interface{}{

// "pre_tags": []string{"<font color='red'>"},

// "post_tags": []string{"</font>"},

// "fields": map[string]interface{}{

// "title": map[string]interface{}{},

// },

// },

//}

//显示所有的

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match_all": map[string]interface{}{},

// },

//}

//es.Search(index, query)

//地理距离过滤器( geo_distance )以给定位置为圆心画一个圆,来找出那些地理坐标落在其中的文档:

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "bool": map[string]interface{}{

// "must": map[string]interface{}{

// "match_all": map[string]interface{}{}, // 这里不设置其他查询条件,所以匹配全部文档

// },

// "filter": map[string]interface{}{

// "geo_distance": map[string]interface{}{

// "distance": "100km",

// "location": map[string]interface{}{

// "lat": 40.715,

// "lon": -73.988,

// },

// }},

// },

// },

// "sort": map[string]interface{}{ // 设置排序条件

// "_geo_distance": map[string]interface{}{ //_geo_distance代表根据距离排序

// "location": map[string]interface{}{ //根据location存储的经纬度计算距离。

// "lat": 40.715, //当前纬度

// "lon": -73.988, //当前经度

// },

// "order": "asc", // asc 表示升序,desc 表示降序

// }},

//}

//es.Search(index, query)

//精确值查询

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match": map[string]interface{}{

// "age": "20",

// },

// },

//}

//es.Search(index, query)

//范围查询

//通过range实现范围查询,类似SQL语句中的>, >=, <, <=表达式。

//gte范围参数 - 等价于>=

//lte范围参数 - 等价于 <=

//范围参数可以只写一个,例如:仅保留 "gte": 10, 则代表 FIELD字段 >= 10

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "range": map[string]interface{}{

// "age": map[string]interface{}{

// "gte": "19",

// "lte": "20",

// },

// },

// },

//}

//es.Search(index, query)

//组合查询 如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用bool语句。

//"must": [], // must条件,类似SQL中的and, 代表必须匹配条件

//"must_not": [], // must_not条件,跟must相反,必须不匹配条件

//"should": [] // should条件,类似SQL中or, 代表匹配其中一个条件

query := map[string]interface{}{

"query": map[string]interface{}{

"bool": map[string]interface{}{

"must": []map[string]interface{}{

{

"match": map[string]interface{}{

"age": "19",

},

},

{

"match": map[string]interface{}{

"title": "中国",

},

},

},

},

},

}

es.Search(index, query)

//使用mysql的方式来请求

//query := map[string]interface{}{

// "query": "select title from " + index + " where title like '%中国%'", //这里使用mysql的方式来请求,非常简单,符合开发习惯,简化es入门门槛,支持order,支持Limit,那么排序和分页就自己写好了

//}

//query := map[string]interface{}{

// "query": "select title from " + index + " where title = '中国'", //这里使用mysql的方式来请求,非常简单,符合开发习惯,简化es入门门槛,支持order,支持Limit,那么排序和分页就自己写好了

//}

//es.SearchEsapiSql(query)

//测试分词

//query := map[string]interface{}{

// "analyzer": "ik_smart", //智能分词用:ik_smart,最大化分词用:ik_max_word

// "text": "中国华人民",

//}

//url := index + "_analyze?pretty=true"

//query := map[string]interface{}{

// "query": map[string]interface{}{

// "match": map[string]interface{}{

// "title": "我爱你中国",

// },

// },

// "highlight": map[string]interface{}{

// "pre_tags": []string{"<font color='red'>"},

// "post_tags": []string{"</font>"},

// "fields": map[string]interface{}{

// "title": map[string]interface{}{},

// },

// },

//}

//url := index + "/_search"

//es.SearchHttp("GET", url, query)

}

````

### 参考资料

https://github.com/elastic/go-elasticsearch

https://www.tizi365.com/archives/590.html

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_creating_an_index.html

## links

- [目录](https://github.com/guyan0319/golang_development_notes/blob/master/zh/preface.md)

- 上一节:

- 下一节:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5分钟入门 - 微信小程序开发
如果你还没有微信公众平台的账号,请先进入 微信公众平台 首页,点击 “立即注册” 按钮进行注册。注册的账号类型可以是订阅号、服务号、小程序以及企业微信,我们选择 “小程序” 即可。
用户6808043
2022/02/25
9280
微信小程序开发入门篇
本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果。 开发准备工作 获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的“
xiangzhihong
2018/02/05
1.5K0
微信小程序开发入门篇
微信小程序开发--【Hello World 及代码结构】(二)
通过上一篇我们已经完成了注册及开发环境的搭建,今天我们来开发我们的第一个微信小程序 微信小程序开发注册流程
先知先觉
2019/01/21
8980
微信小程序开发指引
官方文档教程1:http://bcoder.cn/wxopen/ 官方文档教程2:http://bing.aliaii.com/wxopen/  本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果。这个小程序的首页将会显示欢迎语以及当前用户的微信头像,点击头像,可以在新开的页面中查看当前小程序的启动日志。下载源码 1. 获取微信小程序的 AppID 如果你是收邀请的开发者,我们会提供一个帐号,利用提供的帐号,登录 https://mp.weixin.qq.com ,就可以在网站的
用户1220053
2018/02/09
1.7K0
微信小程序开发指引
微信小程序之获取并解密用户数据(获取openid,nickName等)
本文主要总结微信小程序通过后台请求访问微信用户信息 创建一个微信小程序工程(自行百度) 微信小程序index.js代码 //index.js //获取应用实例 const app = getApp() Page({ data: { motto: 'Hello World', userInfo: {}, backUserInfo:{},//后台得到的微信用户信息 hasUserInfo: false, canIUse: wx.canIUse('button.o
小帅丶
2021/12/28
5.6K0
微信小程序之获取并解密用户数据(获取openid,nickName等)
微信小程序_01程序结构
注意 AppID 目前个人无法申请,使用企业账号可以申请,我们就选择"无AppID"
酷走天涯
2018/09/14
4920
微信小程序_01程序结构
微信小程序开发入门教程
微信小程序开发文档链接为:https://mp.weixin.qq.com/debug/wxadoc/dev/index.html,如下图:
全栈程序员站长
2022/09/06
2.3K0
微信小程序开发入门教程
小程序最新标准授权登录流程+逻辑
小程序自上线以来,官方一直在调整API,因此也出现了一批被废弃的接口,作为程序员的我们,此时此刻千万不能为这不断的变化而感到头疼,应当与时俱进,不断的更新自己的知识储备和应用技能。
王小婷
2018/12/25
1.7K0
微信小程序入门《二》实例:条件渲染、数据遍历、网络请求、获取本地图片
实例内容 条件渲染 数据遍历 网络请求 获取本地图片 实例一: 条件渲染 如果motto为Hello World,则输出你好世界,否则原样输出。 这里是分支条件判断,直接在视图文件里修改,修改inde
极乐君
2018/02/05
1.8K0
微信小程序入门《二》实例:条件渲染、数据遍历、网络请求、获取本地图片
微信小程序开发初探
  (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西。
Edison Zhou
2018/08/20
5.1K0
微信小程序开发初探
【微信小程序】从入门到放弃
前言 关于微信小程序是什么,能做什么的问题,草民在此不在罗列了,随着小程序的天天刷屏,想必您也是来吃一些干货,本篇博文和大家走进微信小程序的从入门到放弃~ 微信小程序开放功能 草民看过很多的文档,微信
极乐君
2018/02/05
1.9K0
【微信小程序】从入门到放弃
微信小程序开发思路
小程序还没有完全开放,不能真实体验,但通过文档和开发工具,可以了解到他的开发思路 下面就介绍下小程序的开发方式,希望能帮助有兴趣的朋友对整体思路有个快速了解 整体结构 默认示例项目的目录结构 从后缀名
dys
2018/04/04
2.7K0
微信小程序开发思路
认识WebStorm-小程序框架wepy
WebStorm是一个功能强大的IDE,适用于JavaScript开发,适合使用Node.js进行复杂的客户端开发和服务器端开发。
达达前端
2019/07/03
1.9K0
认识WebStorm-小程序框架wepy
怎么开发一个简单的小程序_微信小程序编写教程
微信小程序开发文档链接为:https://mp.weixin.qq.com/debug/wxadoc/dev/index.html,如下图:
全栈程序员站长
2022/09/30
3.3K0
怎么开发一个简单的小程序_微信小程序编写教程
「小程序JAVA实战」 小程序默认加载的页面和生命周期(八)
小程序如何加载的呢?生命周期!源码:https://github.com/limingios/wxProgram.git 中的No.3 加载页面 小程序默认加载的pages中的第一个目录 不管你的名称
IT架构圈
2018/12/18
5150
解决微信小程序登录与发布的一些问题
要使用的是本地图片,不想把图片上传到网络再通过https的方式解决,解决方法如下:
达达前端
2022/04/29
7540
解决微信小程序登录与发布的一些问题
微信小程序-开发入门(一)
微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应用场景(用完即走和二维码分发等)还是很值得我们学习的,技术上面如果了解React的话,会发现他们在组件化上面有很多雷同之处。说白了,小程序就是基于微信平台的H5轻应用,微信将系统底层功能(设备、位置、媒体、文件等)和微信自身功能(登录、支付、分享等)封装成相应API供小程序调用。 自己根据官方文档写过一个DOME,借助和风天气开放API接口,实现天气
小古哥
2018/03/08
2.6K2
微信小程序-开发入门(一)
小程序 Tip | 基础概述
每个子目录中保存着一个页面的相关文件 —— 通常是4种不同扩展名的文件, 分别是页面中的逻辑文件、页面结构文件、样式表文件、配置文件; 为了减少开发时的配置项,框架特别约定描述页面的这4个文件必须具备相同的路径和文件名;
凌川江雪
2022/01/20
1.1K0
小程序 Tip | 基础概述
从零新建小程序
一:项目生成 自行下载微信开发者工具-打开微信开发者工具 如下图: 项目:就是项目要存的位置。 AppID:企业级需(小程序申请成功的时候会有这个,个人的不用填写,只是最后不能发布到线上)。 项目名称:demo1(可以根据自己需要起名字) 建立普通快速启动模板(就是快速生成一个小项目) ------点击确定 二:项目预览 确定之后显示的界面如下图 2-1 界面分析 2-2 项目目录 2-21 那么简单的界面,相信你用html分分钟就写好了吧,而且保证目录结构清晰。 2-22 两个文件夹 page
企鹅号小编
2018/01/17
1.2K0
从零新建小程序
前端-微信小程序开发(1):小程序的执行流程是怎么样的?
我们这边最近一直在做基础服务,这一切都是为了完善技术体系,这里对于前端来说便是我们需要做一个Hybrid体系,如果做App,React Native也是不错的选择,但是一定要有完善的分层:
grain先森
2019/03/29
1.9K0
前端-微信小程序开发(1):小程序的执行流程是怎么样的?
推荐阅读
相关推荐
5分钟入门 - 微信小程序开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档