GO語言操作Elasticsearch示例分享
Elasticsearch簡(jiǎn)介
Elasticsearch 是一個(gè)開源的搜索引擎,建立在一個(gè)全文搜索引擎庫 Apache Lucene™ 基礎(chǔ)之上。 Lucene 可以說是當(dāng)下最先進(jìn)、高性能、全功能的搜索引擎庫–無論是開源還是私有。
連接Elasticsearch
// 引入g~
~~~~~-elasticsearch
import (
es8 "github.com/elastic/go-elasticsearch/v8"
)
// go-es配置
conf := es8.Config{
Addresses: "http://127.0.0.1:9200",
Username:"elastic",
Password:"jloMQ7ZCTlcZUr_hmDoB",
}
// 創(chuàng)建
client, err := es8.NewClient(conf);
if err != nil{
fmt.Println("============= 創(chuàng)建 elasticsearch 失敗 =============")
return
}
// 連接
_, err1 := client.Info()
if err1 != nil{
fmt.Println("============= 連接 elasticsearch 失敗 =============")
return
}
創(chuàng)建索引
創(chuàng)建model結(jié)構(gòu)體
type Admin struct{
Id int `gorm:"<-" json:"id"`
UserName string `gorm:"<-" json:"user_name"`
RealName string `gorm:"<-" json:"real_name"`
Mobile string `gorm:"<-" json:"mobile"`
}
初始化model
admin := Admin{
Id: 1,
UserName: "test",
RealName: "測(cè)試",
Mobile: "15222222222",
}
創(chuàng)建索引
// 結(jié)構(gòu)體json序列化
str,err := json.Marshal(admin);
if err != nil{
return ;
}
// 創(chuàng)建索引
res1, err1 := client.Index(
"db.table",
bytes.NewReader(str),
client.Index.WithDocumentID("1"), // 索引ID
client.Index.WithRefresh("true") //是否立即創(chuàng)建
);
搜索數(shù)據(jù)
創(chuàng)建返回結(jié)構(gòu)體
type EsResponse struct{
Hits struct{
Total struct{
Value int `json:"value"`
} `json:"total"`
Hits []struct{
Index string `json:"_index"`
Id string `json:"_id"`
Score float32 `json:"_score"`
Source map[string]any `json:"_source"`
} `json:"hits"`
} `json:"hits"`
}
type EsData struct{
Total int `json:"total"`
List []map[string]any `json:"list"`
}
搜索數(shù)據(jù)
query := map[string]any{
"query":map[string]any{
"bool":map[string]any{
"must":[]map[string]any{
map[string]any{
"match_phrase":map[string]any{
"user_name": "test",
},
},
map[string]any{
"match_phrase":map[string]any{
"mobile": "15222222222",
},
},
},
},
},
}
str,err := json.Marshal(query);
if err != nil{
return ;
}
res1,err1 := client.Search(client.Search.WithBody(bytes.NewReader(str)));
if err1 != nil{
return ;
}
解析數(shù)據(jù)
var resData EsResponse;
err2 := json.NewDecoder(res1.Body).Decode(&resData);
if err2 != nil{
return ;
}
var esData EsData;
esData.Total = resData.Hits.Total.Value;
for _, v := range resData.Hits.Hits {
cache := v.Source
cache["_index"] = v.Index;
cache["_id"] = v.Id;
cache["_score"] = v.Score;
esData.List = append(esData.List,cache)
}
修改數(shù)據(jù)
單條修改
update := map[string]any{
"script": map[string]any{
"source":"ctx._source.user_name='test1';ctx._source.mobile='15211111111';",
"lang": "painless",
},
}
str,err1 := json.Marshal(update)
if err1 != nil{
return ;
}
res2,err2 := client.Update(
"db.table",
"1",
bytes.NewReader(str),
client.Update.WithRefresh("true")
)
if err2 != nil{
return ;
}
批量修改
update := map[string]any{
"query":map[string]any{
"bool":map[string]any{
"must":[]map[string]any{
map[string]any{
"match_phrase":map[string]any{
"user_name": "test",
},
},
map[string]any{
"match_phrase":map[string]any{
"mobile": "15222222222",
},
},
},
},
},
"script": map[string]any{
"source":"ctx._source.user_name='test1';ctx._source.mobile='15211111111';",
"lang": "painless",
},
}
str,err1 := json.Marshal(update)
if err1 != nil{
return ;
}
res2,err2 := client.UpdateByQuery(
[]string{
"db.table",
},
client.UpdateByQuery.WithBody(bytes.NewReader(str)),
client.UpdateByQuery.WithRefresh(true)
)
if err2 != nil{
return ;
}
刪除數(shù)據(jù)
單條刪除
res,err := client.Delete(
"db.table",
"1",
client.Delete.WithRefresh("true")
)
if err != nil{
return ;
}
批量刪除
query := map[string]any{
"query":map[string]any{
"bool":map[string]any{
"must":[]map[string]any{
map[string]any{
"match_phrase":map[string]any{
"user_name": "test",
},
},
map[string]any{
"match_phrase":map[string]any{
"mobile": "15222222222",
},
},
},
},
},
}
str,err := json.Marshal(query);
if err != nil{
return ;
}
res,err := client.DeleteByQuery(
[]string{
"db.table",
},
bytes.NewReader(str),
client.DeleteByQuery.WithRefresh(true)
)到此這篇關(guān)于GO語言操作Elasticsearch示例分享的文章就介紹到這了,更多相關(guān)GO語言操作Elasticsearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言使用range來接收通道里面的數(shù)據(jù)
本文主要介紹了go語言使用range來接收通道里面的數(shù)據(jù),for ... range?循環(huán)會(huì)一直從通道中接收值,直到通道關(guān)閉并且所有值都被接收完畢,下面就來介紹一下,感興趣的可以了解一下2025-04-04
Golang?WorkerPool線程池并發(fā)模式示例詳解
這篇文章主要為大家介紹了Golang?WorkerPool線程池并發(fā)模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
golang構(gòu)建HTTP服務(wù)的實(shí)現(xiàn)步驟
GO 語言運(yùn)行環(huán)境的基礎(chǔ)知識(shí)
對(duì)Golang import 導(dǎo)入包語法詳解

