【轻知识】通过sql查询elasticsearch(demo)
2019-04-30 本文已影响0人
言十年
demo 效果

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)
}
}