关于golang:go操作elasticsearch示例

59次阅读

共计 9822 个字符,预计需要花费 25 分钟才能阅读完成。

这里我应用 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

  • 目录
  • 上一节:
  • 下一节:

正文完
 0