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)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值