go語言操作es的實現(xiàn)示例
Elasticsearch
介紹
Elasticsearch(ES)是一個基于Lucene構建的開源、分布式、RESTful接口的全文搜索引擎。Elasticsearch還是一個分布式文檔數(shù)據(jù)庫,其中每個字段均可被索引,而且每個字段的數(shù)據(jù)均可被搜索,ES能夠橫向擴展至數(shù)以百計的服務器存儲以及處理PB級的數(shù)據(jù)??梢栽跇O短的時間內存儲、搜索和分析大量的數(shù)據(jù)。通常作為具有復雜搜索場景情況下的核心發(fā)動機。
Elasticsearch能做什么
- 當你經(jīng)營一家網(wǎng)上商店,你可以讓你的客戶搜索你賣的商品。在這種情況下,你可以使用ElasticSearch來存儲你的整個產品目錄和庫存信息,為客戶提供精準搜索,可以為客戶推薦相關商品。
- 當你想收集日志或者交易數(shù)據(jù)的時候,需要分析和挖掘這些數(shù)據(jù),尋找趨勢,進行統(tǒng)計,總結,或發(fā)現(xiàn)異常。在這種情況下,你可以使用Logstash或者其他工具來進行收集數(shù)據(jù),當這引起數(shù)據(jù)存儲到ElasticsSearch中。你可以搜索和匯總這些數(shù)據(jù),找到任何你感興趣的信息。
- 對于程序員來說,比較有名的案例是GitHub,GitHub的搜索是基于ElasticSearch構建的,在github.com/search頁面,你可以搜索項目、用戶、issue、pull request,還有代碼。共有40~50個索引庫,分別用于索引網(wǎng)站需要跟蹤的各種數(shù)據(jù)。雖然只索引項目的主分支(master),但這個數(shù)據(jù)量依然巨大,包括20億個索引文檔,30TB的索引文件。
go語言操作es
go get github.com/olivere/elastic
解決golang使用elastic連接elasticsearch時自動轉換連接地址

elastic.SetSniff(false)
client, _ := elastic.NewClient( // ... // 將sniff設置為false后,便不會自動轉換地址 elastic.SetSniff(false), )

初始化
var client *elastic.Client
var host = "http://xxx:9200"
//初始化es驅動
func init() {
errorlog := log.New(os.Stdout, "app", log.LstdFlags)
var err error
client, err = elastic.NewClient(elastic.SetErrorLog(errorlog), elastic.SetURL(host), elastic.SetSniff(false))
if err != nil {
panic(err)
}
info, code, err := client.Ping(host).Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("Es return with code %d and version %s \n", code, info.Version.Number)
esversionCode, err := client.ElasticsearchVersion(host)
if err != nil {
panic(err)
}
fmt.Printf("es version %s\n", esversionCode)
}
數(shù)據(jù)創(chuàng)建
info —>employee -------FirstName,LastName,Age,About,Interests
結構體方式
type Employee struct {
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
Age int `json:"age"`
About string `json:"about"`
Interests []string `json:"interests"`
}
//創(chuàng)建索引
func create() {
//1.使用結構體方式存入到es里面
e1 := Employee{"jane", "Smith", 20, "I like music", []string{"music"}}
put, err := client.Index().Index("info").Type("employee").Id("1").BodyJson(e1).Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("indexed %d to index %s, type %s \n", put.Id, put.Index, put.Type)
}
func main() {
create()
}
字符串方式:
func create1() {
//使用字符串
e1 := `{"firstname":"john","lastname":"smith","age":22,"about":"i like book","interests":["book","music"]}`
put, err := client.Index().Index("info").Type("employee").Id("2").BodyJson(e1).Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("indexed %d to index %s, type %s \n", put.Id, put.Index, put.Type)
}
查找
//查找
func get() {
get, err := client.Get().Index("info").Type("employee").Id("1").Do(context.Background())
if err != nil {
panic(err)
}
if get.Found {
fmt.Printf("got document %s in version %d from index %s,type %s \n", get.Id, get.Version, get.Index, get.Type)
}
}
func main() {
get()
}
修改
func update() {
res, err := client.Update().Index("info").Type("employee").Id("1").Doc(map[string]interface{}{"age": 88}).Do(context.Background())
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("update age %s \n", res.Result)
}
func main() {
update()
}
刪除
//刪除
func delete() {
res, err := client.Delete().Index("info").Type("employee").Id("1").Do(context.Background())
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("delete result %s", res.Result)
}
func main() {
delete()
}
查找
func query() {
var res *elastic.SearchResult
var err error
res, err = client.Search("info").Type("employee").Do(context.Background())
printEmployee(res, err)
}
//打印查詢的employee
func printEmployee(res *elastic.SearchResult, err error) {
if err != nil {
fmt.Print(err.Error())
return
}
var typ Employee
for _, item := range res.Each(reflect.TypeOf(typ)) {
t := item.(Employee)
fmt.Printf("%#v\n", t)
}
}
//條件查找
func query1() {
var res *elastic.SearchResult
var err error
//查找方式一:
q := elastic.NewQueryStringQuery("lastname:smith")
res, err = client.Search("info").Type("employee").Query(q).Do(context.Background())
printEmployee(res, err)
//查找方法二:
if res.Hits.TotalHits > 0 {
fmt.Printf("found a total fo %d Employee", res.Hits.TotalHits)
for _, hit := range res.Hits.Hits {
var t Employee
err := json.Unmarshal(*hit.Source, &t) //另一種取出的方法
if err != nil {
fmt.Println("failed")
}
fmt.Printf("employee name %s:%s\n", t.FirstName, t.LastName)
}
} else {
fmt.Printf("found no employee \n")
}
}
年齡大于21的查找
//年齡大于21的
func query3() {
var res *elastic.SearchResult
var err error
boolq := elastic.NewBoolQuery()
boolq.Must(elastic.NewMatchQuery("lastname", "smith"))
boolq.Filter(elastic.NewRangeQuery("age").Gt(21))
res, err = client.Search("info").Type("employee").Query(boolq).Do(context.Background())
printEmployee(res, err)
}
//打印查詢的employee
func printEmployee(res *elastic.SearchResult, err error) {
if err != nil {
fmt.Print(err.Error())
return
}
var typ Employee
for _, item := range res.Each(reflect.TypeOf(typ)) {
t := item.(Employee)
fmt.Printf("%#v\n", t)
}
}
包含book的
//包含book的
func query4() {
var res *elastic.SearchResult
var err error
matchPhrase := elastic.NewMatchPhraseQuery("about", "book")
res, err = client.Search("info").Type("employee").Query(matchPhrase).Do(context.Background())
printEmployee(res, err)
}
分頁
//分頁
func list(size, page int) {
var res *elastic.SearchResult
var err error
if size < 0 || page < 1 {
fmt.Printf("param error")
return
}
res, err = client.Search("info").Type("employee").Size(size).From((page - 1) * size).Do(context.Background())
printEmployee(res, err)
}
集群搭建
配置文件修改
node.name : node-102 node.name : node-103 network.host: 192.168.1.102 network.host: 192.168.1.103 discovery.zen.ping.unicast.hosts: ["s201","s202","s203"]


到此這篇關于go語言操作es的實現(xiàn)示例的文章就介紹到這了,更多相關go語言操作es內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang實現(xiàn)簡易的分布式系統(tǒng)方法
這篇文章主要介紹了golang實現(xiàn)簡易的分布式系統(tǒng)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
golang中拿slice當queue和拿list當queue使用分析
這篇文章主要為大家介紹了golang?中拿slice當queue和拿list當queue使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Golang?Template實現(xiàn)自定義函數(shù)的操作指南
這篇文章主要為大家詳細介紹了Golang如何利用Template實現(xiàn)自定義函數(shù)的操作,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下2025-02-02

