这里我应用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{"<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 依据 索引名 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 mainimport "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
- 目录
- 上一节:
- 下一节: