zoukankan      html  css  js  c++  java
  • go es

    安装go package:

    go get github.com/olivere/elastic
    

    开撸:

    /**
    * es demo
    * author:JetWu
    * date:2020.06.10
     */
    package es
    
    import (
        "context"
        "errors"
        "fmt"
        "log"
        "reflect"
    
        "encoding/json"
    
        "github.com/olivere/elastic"
    )
    
    type Student struct {
        Name         string   `json:"name"`
        Age          int      `json:"age"`
        City         string   `json:"city"`
        Interests    []string `json:"interests"`
        Introduction string   `json:"introduction"`
    }
    
    var client *elastic.Client
    var host = "http://127.0.0.1:9200/"
    
    /**
    * 连接es
     */
    func init() {
        log.Println("Connecting to elasticsearch server...")
        //连接es
        var err error
        client, err = elastic.NewSimpleClient(elastic.SetURL(host))
        if err != nil {
            log.Println("Connected failed: ", err)
            return
        }
        log.Println("Connected succeed!")
        //测试es连接
        info, _, err := client.Ping(host).Do(context.Background())
        if err != nil {
            log.Println("Ping elasticsearch server failed: ", err)
            return
        }
        log.Println("elasticsearch version: ", info.Version.Number)
    }
    
    /**
    * 打印查询语句
     */
    func PrintQuery(src interface{}) {
        data, err := json.MarshalIndent(src, "", "")
        if err != nil {
            log.Println("PrintQuery Error: ", err)
            return
        }
        fmt.Println("PrintQuery:
    ", string(data))
    }
    
    /**
    * 搜索
     */
    func Search(keyword string) []*Student {
        queryStr := `{
            "bool": {
                "should": [
                    {
                        "match": {"name":"%s"}
                    },
                    {
                        "match": {"city":"%s"}
                    },
                    {
                        "match": {"interests":"%s"}
                    },
                    {
                        "match": {"introduction":"%s"}
                    }
                ]
            }
        }`
        rawQuery := elastic.NewRawStringQuery(fmt.Sprintf(queryStr, keyword, keyword, keyword, keyword))
        PrintQuery(rawQuery)
    
        searchResult, err := client.Search("school").Type("student").
            Query(rawQuery).From(0).Size(10).Do(context.Background())
        if err != nil {
            log.Println("Search Error: ", err)
            return nil
        }
        fmt.Printf("Query took %d milliseconds, total: %d
    ", searchResult.TookInMillis, searchResult.Hits.TotalHits)
    
        var students []*Student
        var stuType Student
        for _, item := range searchResult.Each(reflect.TypeOf(stuType)) {
            if stu, ok := item.(Student); ok {
                students = append(students, &stu)
            }
        }
        return students
    }
    
    /**
    * 添加/修改
     */
    func Add(indexId string, stu *Student) error {
        if stu == nil {
            return errors.New("Add Error: data empty!")
        }
        ret, err := client.Index().Index("school").Type("student").
            Id(indexId).BodyJson(stu).Do(context.Background())
        if err != nil {
            log.Println("Add Error: ", err)
            return err
        }
        fmt.Printf("Indexed %s to index %s, type %s
    ", ret.Id, ret.Index, ret.Type)
        return nil
    }
    
    /**
    * 删除
     */
    func Remove(indexId string) error {
        ret, err := client.Delete().Index("school").Type("student").
            Id(indexId).Do(context.Background())
        if err != nil {
            log.Println("Remove Error: ", err)
            return err
        }
        fmt.Printf("delete result: %d, %s
    ", ret.Status, ret.Result)
        return nil
    }
    

      

  • 相关阅读:
    gradle文件中自定义字段值在java代码中使用
    Kotlin中,lateinit 和 lazy{} 的区别
    AndroidStudio Terminal的使用
    组件化踩过的坑
    MVP
    关于组件化的思考
    AspectJ使用的遇到的坑
    使用AOP思想无侵入式申请权限,解决组件化中权限问题(一)
    小米造最强超分辨率算法 | Fast, Accurate and Lightweight Super-Resolution with Neural Architecture Search
    新型超分辨率方法:用神经网络迁移参照图像纹理
  • 原文地址:https://www.cnblogs.com/wujuntian/p/13087071.html
Copyright © 2011-2022 走看看