首頁 > 軟體

go語言操作es的實現範例

2022-04-20 13:01:00

Elasticsearch

介紹

Elasticsearch(ES)是一個基於Lucene構建的開源、分散式、RESTful介面的全文搜尋引擎。Elasticsearch還是一個分散式檔案資料庫,其中每個欄位均可被索引,而且每個欄位的資料均可被搜尋,ES能夠橫向擴充套件至數以百計的伺服器儲存以及處理PB級的資料。可以在極短的時間記憶體儲、搜尋和分析大量的資料。通常作為具有複雜搜尋場景情況下的核心發動機。

Elasticsearch能做什麼

  • 當你經營一家網上商店,你可以讓你的客戶搜尋你賣的商品。在這種情況下,你可以使用ElasticSearch來儲存你的整個產品目錄和庫存資訊,為客戶提供精準搜尋,可以為客戶推薦相關商品。
  • 當你想收集紀錄檔或者交易資料的時候,需要分析和挖掘這些資料,尋找趨勢,進行統計,總結,或發現異常。在這種情況下,你可以使用Logstash或者其他工具來進行收集資料,當這引起資料儲存到ElasticsSearch中。你可以搜尋和彙總這些資料,找到任何你感興趣的資訊。
  • 對於程式設計師來說,比較有名的案例是GitHub,GitHub的搜尋是基於ElasticSearch構建的,在github.com/search頁面,你可以搜尋專案、使用者、issue、pull request,還有程式碼。共有40~50個索引庫,分別用於索引網站需要跟蹤的各種資料。雖然只索引專案的主分支(master),但這個資料量依然巨大,包括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 %sn", esversionCode)
}

資料建立

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"`
}

//建立索引
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("%#vn", 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:%sn", 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("%#vn", 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的實現範例的文章就介紹到這了,更多相關go語言操作es內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com