go操作elasticsearch示例
【go操作elasticsearch示例】这里我使用elasticsearch官方给的go语言包(go-elasticsearch)
go-elasticsearch向前兼容,这意味着客户端支持与更大或同等次要版本的 Elasticsearch 通信。Elasticsearch 语言客户端仅向后兼容默认发行版,不提供任何保证。
- 包:https://github.com/elastic/go...
- Elasticsearch 权威指南:https://www.elastic.co/guide/...
版本
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 esimport (
"bytes"
"context"
"encoding/json"
"fmt"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
"log"
"net/http"
)var EsClient *elasticsearch.Clientfunc init() {cfg := elasticsearch.Config{
Addresses: []string{
"http://localhost:9200",
},
}
var err error
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.Buffer
//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.Buffer
//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.Buffer
//query := map[string]interface{}{
//"query": map[string]interface{}{
//"match": map[string]interface{}{
//"title": title,
//},
//},
//"highlight": map[string]interface{}{
//"pre_tags":[]string{""},
//"post_tags": []string{""},
//"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 根据 索引名 idfunc 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.Buffer
//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{""},
//"post_tags": []string{""},
//"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{""},
//"post_tags": []string{""},
//"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{""},
//"post_tags": []string{""},
//"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{""},
//"post_tags": []string{""},
//"fields": map[string]interface{}{
//"title": map[string]interface{}{},
//},
//},
//}
//url := index + "/_search"//es.SearchHttp("GET", url, query)}
参考资料
https://github.com/elastic/go...
https://www.tizi365.com/archi...
https://www.elastic.co/guide/...
links
- 目录
- 上一节:
- 下一节:
推荐阅读
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- MongoDB,Wondows下免安装版|MongoDB,Wondows下免安装版 (简化版操作)
- 逻辑回归的理解与python示例
- 在线版的迅捷思维导图怎么操作()
- 操作系统|[译]从内部了解现代浏览器(1)
- 数据库总结语句
- JS常见数组操作补充
- 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件
- 炒股知识(超级短线操作的秘籍|炒股知识:超级短线操作的秘籍 玩转股市)
- 1.2序列通用操作