golang elasticsearch 搜索封装

xie1xiao1jun · 2021-08-11 20:56:29 · 1992 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-08-11 20:56:29 的文章,其中的信息可能已经有所发展或是发生改变。

#日志系统说明

  • 先来传送门:

代码传送门

  • 1、日志主要说明:谁在什么时间,在什么地方,做了什么事情,产生了什么影响,影响的变化因子。

  • 2、日志系统主要建设在oplogger基础上。将现有的mysql存储方式改成elasticsearch的存储方式。并且更新了现有字段,使其更优化

  • 3、以下为主要设计原理图:

说明:

  1. trace_id : 用来追踪一个请求的全服务调用流向
  2. 应用/服务的唯一标识: 用来确定日志产生的应用服务器的唯一标识(可以细分)
  3. 业务项的唯一标识: 用来确定逻辑段的唯一标识,如orderid,sku,stokin_code 等
  4. 时间序列表: 用来记录日志的变化时间序,及日志创建的时间点
  5. 事件序列、描述: 具体描述一件事情;如打包调试信息,封箱错误信息,拆包裹业务信息
  6. 变化值序列: 描述事件内部的不同变化值
  7. 备注: 用于一些说明
  8. 预留字段: 用来扩展日志系统业务能力
  9. caller: 日志产生的当前文件名及行号等信息
  10. user_id,user_name :添加操作人记录

6、golang elasticsearch 查询封装:

  • 初始化
import (
    "github.com/xxjwxc/esLog/view/es"
)

func main(){
    client,_ := New(WithIndexName("test_log"), WithAddrs("http://192.168.198.17:9200/"))
    //精确搜索
    term := make(map[string]interface{})
    term["topic"] = "topic"
    term["etype"] = oplogger.EOpType_EOpGunbuster
    term["user_name"] = "username"
    term["ekey"] = "iddd-1"
    term["elevel"] = oplogger.ELogLevel_EOperate
    //模糊匹配
    match := make(map[string]interface{})
    match["desc"] = "desc"
    match["attach"] = "attach"

    // 时间范围
    timeCase := make(map[string]CaseSection)
    timeCase["creat_time"] = CaseSection{
        Min: time.Now().AddDate(0, 0, -1),
        Max: time.Now(),
    }

    //构造搜索器
    var que EsQuery
    que.OnPages(0, 10).OnTerm(term).OnMatch(match).OnRangeTime(timeCase)

    // 打印查询字符串 
    data1, _ := json.Marshal(que.OnSource())
    fmt.Println(string(data1))

    // 查询结果
    client, _ := New(WithIndexName(Index), WithAddrs(url))
    var eslog []ESLog
    client.WithOption(WithIndexName(Index), WithTypeName(Index)).Search(que.OnSource(), func(e []byte) error {
        var tmp ESLog
        json.Unmarshal(e, &tmp)
        eslog = append(eslog, tmp)
        return nil
    })

    fmt.Println(eslog)// 答应结果
}

6、逻辑及代码调用说明:

日志写入调用:

//批量添加
client.BulkAdd(list)

日志写入调用:

//批量添加
client.Add(info)

日志搜索:

//精确搜索
term := make(map[string]interface{})
...
//模糊匹配
match := make(map[string]interface{})
...
//时间段搜索
timeCase := make(map[string]es.CaseSection)
...


// tools 搜索
eslist := tools.Search(term, match, timeCase, req.Page, req.Limit)

说明:以接口解耦,具体业务根据不同需求实现接口实现。主要用来对数据分流。

传送门

设计思想


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1992 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传