goweb ESServer服务接口实现优化:使用elasticsearch与原接口无缝对接,请求对象是JSON
·


package goelastic
import (
"context"
"encoding/json"
"errors"
"fmt"
"gitee.com/leijmdas/gobase/goconfig/common/base/basedto"
"gitee.com/leijmdas/gobase/goconfig/common/base/baseutils"
"gitee.com/leijmdas/gobase/goconfig/common/base/jsonutils"
"gitee.com/leijmdas/gobase/goconfig/common/golog"
"gitee.com/leijmdas/gobase/goconfig/common/ichubconfig"
"gitee.com/leijmdas/goweb/goes/pagees"
"gitee.com/leijmdas/goweb/goes/pagereq"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
"github.com/gogf/gf/util/gconv"
"github.com/olivere/elastic/v7"
"github.com/sirupsen/logrus"
"io"
"strings"
)
type GoElastic struct {
basedto.BaseEntitySingle
client *elasticsearch.Client
Opened bool `json:"opened"`
Info string `json:"init"`
}
func Default() *GoElastic {
return baseutils.NewOfPtrTypeProxy[*GoElastic]()
}
func NewGoElasticCli() *GoElastic {
//var s = &GoElastic{}
//s.InitProxy(s)
//s.Init()
return Default()
}
func (self *GoElastic) Client() *elasticsearch.Client {
return self.client
}
func (self *GoElastic) Search(o ...func(*esapi.SearchRequest)) (*esapi.Response, error) {
return self.client.Search(o...)
}
func (self *GoElastic) Search2Map(o ...func(*esapi.SearchRequest)) (map[string]any, error) {
var res, err = self.Search(o...)
if err != nil {
logrus.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
if res.IsError() {
logrus.Fatalf("Error: %s", res.String())
return nil, err
}
var r map[string]any
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
logrus.Fatalf("Error parsing the response body: %s", err)
}
// 打印查询结果
fmt.Printf("Query result: %v\n", jsonutils.ToJsonPretty(r))
return r, nil
}
func (self *GoElastic) Search2PageEsResult(o ...func(*esapi.SearchRequest)) *pagees.PageEsResult {
var res, err = self.Search2SearchResult(o...)
if err != nil {
golog.Error(err)
return pagees.FailedPageEsResultErr(err)
}
var result = pagees.FindBeanPageEsResult()
result.PageEsResultOfSearch(res, false)
return result
}
func (self *GoElastic) Search2SearchResult(o ...func(*esapi.SearchRequest)) (*elastic.SearchResult, error) {
var res, err = self.Search(o...)
if err != nil {
logrus.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
if res.IsError() {
logrus.Fatalf("Error: %s", res.String())
return nil, err
}
if res.StatusCode != 200 {
golog.Error("Error: status code=", res.Status())
return nil, errors.New("status code =" + gconv.String(res.StatusCode))
}
var searchRes = new(elastic.SearchResult)
if err := json.NewDecoder(res.Body).Decode(searchRes); err != nil {
logrus.Fatalf("Error parsing the response body: %s", err)
}
// 打印查询结果
fmt.Printf("Query result: %v\n", jsonutils.ToJsonPretty(searchRes))
return searchRes, nil
}
func (self *GoElastic) SetClient(client *elasticsearch.Client) {
self.client = client
}
func (self *GoElastic) Init() {
var err error
var esdto = ichubconfig.FindBeanIchubConfig().ReadIchubEs()
golog.Info(esdto)
self.client, err = elasticsearch.NewClient(elasticsearch.Config{
Addresses: strings.Split(esdto.URL, ","),
Username: esdto.Username,
Password: esdto.Password,
})
self.Opened = err == nil
if err != nil {
golog.Error("Error creating the client: ", err)
}
}
func (self *GoElastic) makeBody(req *pagereq.QueryRequest) io.Reader {
var q = map[string]any{}
q["query"], _ = req.BuildBoolQuery().Source()
return strings.NewReader(jsonutils.ToJsonPretty(q))
}
func (self *GoElastic) Query(req *pagereq.QueryRequest) *pagees.PageEsResult {
var res, err = self.Search2SearchResult(
self.client.Search.WithContext(context.Background()),
self.client.Search.WithIndex(strings.Split(req.IndexName, ",")...),
//client.Search.WithQuery(query),
self.client.Search.WithBody(self.makeBody(req)),
self.client.Search.WithPretty(),
self.client.Search.WithSize(req.Limit()),
self.client.Search.WithFrom(req.Start()),
self.client.Search.WithSource(req.Source))
if err != nil {
golog.Error(err)
return pagees.FailedPageEsResultErr(err)
}
var result = pagees.FindBeanPageEsResult()
result.PageEsResultOfSearch(res, false)
return result
}
func (suite *TestGoElasticSuite) Test001_Search() {
var src, _ = elastic.NewMatchQuery("name", "市场部门").Source()
var q = map[string]any{}
q["query"] = src
var qq = pagereqcli.Default().SetPageSize(2)
qq.Aggregation("count", elastic.NewValueCountAggregation().Field("shop_count"))
qq.Aggregation("stats", elastic.NewStatsAggregation().Field("shop_count"))
var agg, _ = elastic.NewStatsAggregation().Field("shop_count").Source()
var aggs = map[string]any{}
aggs["count"] = agg
q["aggs"] = aggs
var reader = strings.NewReader(jsonutils.ToJsonPretty(q))
var qs = `{
"match_all": {
}
}`
q["query"] = qs
q["query"], _ = elastic.NewMatchQuery("short_name", "古泳").Source() //Query(tic.NewMatchAllQuery()) //
res, err := suite.inst.Search2SearchResult(
suite.inst.Client().Search.WithContext(context.Background()),
suite.inst.Client().Search.WithIndex("ichub_sys_dept"),
//suite.inst.Client().Search.WithQuery(query),
suite.inst.Client().Search.WithBody(reader),
suite.inst.Client().Search.WithPretty(),
suite.inst.Client().Search.WithSize(2),
suite.inst.Client().Search.WithSource("id,name"),
)
golog.Info(res, err)
var result = pagees.FindBeanPageEsResult()
result.PageEsResultOfSearch(res, false)
golog.Info(result, suite.inst)
}
更多推荐



所有评论(0)