【轻知识】通过sql查询elasticsearch(demo)

2019-04-30  本文已影响0人  言十年

demo 效果

image.png

demo功能

把SQL转换成es的DSL。github.com/farmerx/elasticsql

操作esgopkg.in/olivere/elastic.v6

olivere/elastic,安装文档(https://olivere.github.io/elastic/)来是go get github.com/olivere/elastic,但是我发现我down下的包实际上是ES7.0的,因为我根据报错找到github上的issue,看了看代码跟6版本不一样。于是参考了https://gopkg.in/olivere/elastic.v6。安装了。

代码如下

package main

import (
    "encoding/json"
    "context"
    "fmt"
    "net/http"
    "strings"
    "log"
    "github.com/farmerx/elasticsql"
    "gopkg.in/olivere/elastic.v6"
)
 
func search(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    sql := strings.Join(r.Form["sql"],"")
    fmt.Println(sql)
    esql := elasticsql.NewElasticSQL()
    table, dsl, err := esql.SQLConvert(r.Form.Get("sql"))
    fmt.Println(table, dsl, err)
    host := "http://xxx:9200"//测试机器
    client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL(host))
    fmt.Println("3333333")
    if err != nil {
        panic(err)
        fmt.Println("client error")
    }
    info, code, err := client.Ping(host).Do(context.Background())
    if err != nil {
        // Handle error
        fmt.Println("ddddddddddd")
    }
    fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
    esversion, err := client.ElasticsearchVersion(host)
    if err != nil {
        return 
    }
    log.Printf("Elasticsearch version %s\n", esversion)
    exists, err := client.IndexExists("co_adsense").Do(context.Background())
    if err != nil {
        // Handle error
    }
    fmt.Println("存在么?")
    fmt.Println(exists)
    if !exists {
        // Index does not exist yet.
    }
    res, err := client.Search().Index("co_adsense").Source(dsl).Pretty(true).Do(context.Background())
    
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(res.Hits)
    b,err := json.Marshal(res.Hits)
    if err != nil {
        fmt.Println("json.Marshal failed:", err)
        return
    }
    fmt.Fprintf(w, string(b)) //这个写入到w的是输出到客户端的
}
func main() {
    http.HandleFunc("/search",search)
    err := http.ListenAndServe(":9091", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
上一篇 下一篇

猜你喜欢

热点阅读