这里我应用 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 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 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{"<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.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{"<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…
https://www.tizi365.com/archi…
https://www.elastic.co/guide/…
links
- 目录
- 上一节:
- 下一节: