• elasticsearch golang的sdk使用


    文档第一

    《elasticsearch权威指南》直接看官网在线版的,比较新,网上那些pdf版的,都是2.x版的,许多不兼容
    官方API手册,可以选择版本。

    golang sdk库的选择

    主要有以下两个

    • github.com/olivere/elastic 第三方开发,各个版本都有对应的sdk,文档也丰富
    • github.com/elastic/go-elasticsearch 不做评论
      最终我们选择了olivere/elastic

    restful api和olivere/elastic 的对应代码如下:

    package main
    
    import (
    	"context"
    	"encoding/json"
    	"fmt"
    	"gopkg.in/olivere/elastic.v5" //这里使用的是版本5,最新的是6,有改动
    	"log"
    	"os"
    	"reflect"
    )
    
    var client *elastic.Client
    var host = "http://127.0.0.1:9200/"
    
    type Employee struct {
    	FirstName string   `json:"first_name"`
    	LastName  string   `json:"last_name"`
    	Age       int      `json:"age"`
    	About     string   `json:"about"`
    	Interests []string `json:"interests"`
    }
    
    //初始化
    func init() {
    	errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
    	var err error
    	client, err = elastic.NewClient(elastic.SetErrorLog(errorlog), elastic.SetURL(host))
    	if err != nil {
    		panic(err)
    	}
    	info, code, err := client.Ping(host).Do(context.Background())
    	if err != nil {
    		panic(err)
    	}
    	fmt.Printf("Elasticsearch returned with code %d and version %s
    ", code, info.Version.Number)
    
    	esversion, err := client.ElasticsearchVersion(host)
    	if err != nil {
    		panic(err)
    	}
    	fmt.Printf("Elasticsearch version %s
    ", esversion)
    
    }
    
    /*下面是简单的CURD*/
    
    //创建
    func create() {
    
    	//使用结构体
    	e1 := Employee{"Jane", "Smith", 32, "I like to collect rock albums", []string{"music"}}
    	put1, err := client.Index().
    		Index("megacorp").
    		Type("employee").
    		Id("1").
    		BodyJson(e1).
    		Do(context.Background())
    	if err != nil {
    		panic(err)
    	}
    	fmt.Printf("Indexed tweet %s to index s%s, type %s
    ", put1.Id, put1.Index, put1.Type)
    
    	//使用字符串
    	e2 := `{"first_name":"John","last_name":"Smith","age":25,"about":"I love to go rock climbing","interests":["sports","music"]}`
    	put2, err := client.Index().
    		Index("megacorp").
    		Type("employee").
    		Id("2").
    		BodyJson(e2).
    		Do(context.Background())
    	if err != nil {
    		panic(err)
    	}
    	fmt.Printf("Indexed tweet %s to index s%s, type %s
    ", put2.Id, put2.Index, put2.Type)
    
    	e3 := `{"first_name":"Douglas","last_name":"Fir","age":35,"about":"I like to build cabinets","interests":["forestry"]}`
    	put3, err := client.Index().
    		Index("megacorp").
    		Type("employee").
    		Id("3").
    		BodyJson(e3).
    		Do(context.Background())
    	if err != nil {
    		panic(err)
    	}
    	fmt.Printf("Indexed tweet %s to index s%s, type %s
    ", put3.Id, put3.Index, put3.Type)
    
    }
    
    //删除
    func delete() {
    
    	res, err := client.Delete().Index("megacorp").
    		Type("employee").
    		Id("1").
    		Do(context.Background())
    	if err != nil {
    		println(err.Error())
    		return
    	}
    	fmt.Printf("delete result %s
    ", res.Result)
    }
    
    //修改
    func update() {
    	res, err := client.Update().
    		Index("megacorp").
    		Type("employee").
    		Id("2").
    		Doc(map[string]interface{}{"age": 88}).
    		Do(context.Background())
    	if err != nil {
    		println(err.Error())
    	}
    	fmt.Printf("update age %s
    ", res.Result)
    
    }
    
    //查找
    func gets() {
    	//通过id查找
    	get1, err := client.Get().Index("megacorp").Type("employee").Id("2").Do(context.Background())
    	if err != nil {
    		panic(err)
    	}
    	if get1.Found {
    		fmt.Printf("Got document %s in version %d from index %s, type %s
    ", get1.Id, get1.Version, get1.Index, get1.Type)
    	}
    }
    
    //搜索
    func query() {
    	var res *elastic.SearchResult
    	var err error
    	//取所有
    	res, err = client.Search("megacorp").Type("employee").Do(context.Background())
    	printEmployee(res, err)
    
    	//字段相等
    	q := elastic.NewQueryStringQuery("last_name:Smith")
    	res, err = client.Search("megacorp").Type("employee").Query(q).Do(context.Background())
    	if err != nil {
    		println(err.Error())
    	}
    	printEmployee(res, err)
    
    	if res.Hits.TotalHits > 0 {
    		fmt.Printf("Found a total of %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("Deserialization failed")
    			}
    
    			fmt.Printf("Employee name %s : %s
    ", t.FirstName, t.LastName)
    		}
    	} else {
    		fmt.Printf("Found no Employee 
    ")
    	}
    
    	//条件查询
    	//年龄大于30岁的
    	boolQ := elastic.NewBoolQuery()
    	boolQ.Must(elastic.NewMatchQuery("last_name", "smith"))
    	boolQ.Filter(elastic.NewRangeQuery("age").Gt(30))
    	res, err = client.Search("megacorp").Type("employee").Query(q).Do(context.Background())
    	printEmployee(res, err)
    
    	//短语搜索 搜索about字段中有 rock climbing
    	matchPhraseQuery := elastic.NewMatchPhraseQuery("about", "rock climbing")
    	res, err = client.Search("megacorp").Type("employee").Query(matchPhraseQuery).Do(context.Background())
    	printEmployee(res, err)
    
    	//分析 interests
    	aggs := elastic.NewTermsAggregation().Field("interests")
    	res, err = client.Search("megacorp").Type("employee").Aggregation("all_interests", aggs).Do(context.Background())
    	printEmployee(res, err)
    
    }
    
    //简单分页
    func list(size,page int) {
    	if size < 0 || page < 1 {
    		fmt.Printf("param error")
    		return
    	}
    	res,err := client.Search("megacorp").
    		Type("employee").
    		Size(size).
    		From((page-1)*size).
    		Do(context.Background())
            printEmployee(res, err)
    
    }
    
    //打印查询到的Employee
    func printEmployee(res *elastic.SearchResult, err error) {
    	if err != nil {
    		print(err.Error())
    		return
    	}
    	var typ Employee
    	for _, item := range res.Each(reflect.TypeOf(typ)) { //从搜索结果中取数据的方法
    		t := item.(Employee)
    		fmt.Printf("%#v
    ", t)
    	}
    }
    
    func main() {
    	create()
    	delete()
    	update()
    	gets()
    	query()
            list()
    }
    

    辅助工具

    • ElasticHD 单文件可执行文件,而且支持sql转es的查询
    • mobz/elasticsearch-head es 5.0以后不支持插件安装,而是需要通过node来运行http服务器,或者通过Google浏览器插件
      最终选择了ElasticHD
  • 相关阅读:
    java日常问题和技巧1(BigDecimal与int相互转换、判断某元素是否在数组中、求两个List并集、int[]转Integer[])
    窗口小部件基础编写V1.0----没有Service
    使用MyBatis遇到的问题及解决方法(一)(持续更新)
    java工具类集合(一)
    idea部分操作(一)----持续更新
    单向链表(篇九)
    结构体(篇八)
    指针与字符串(篇七)
    数组字符串(篇六)
    循环与函数(篇五)
  • 原文地址:https://www.cnblogs.com/xdao/p/elasticsearch_golang.html
Copyright © 2020-2023  润新知