V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xxjwxc
V2EX  ›  程序员

golang elasticsearch 搜索封装

  •  
  •   xxjwxc ·
    xxjwxc · 2021-08-11 20:55:46 +08:00 · 1124 次点击
    这是一个创建于 978 天前的主题,其中的信息可能已经有所发展或是发生改变。

    #日志系统说明

    • 先来传送门:

    代码传送门

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

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

    传送门

    设计思想

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5567 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:29 · PVG 16:29 · LAX 01:29 · JFK 04:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.