zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/xdao/p/elasticsearch_golang.html
Copyright © 2011-2022 走看看