Go语言操作Elasticsearch查询时如何插入格式化占位符?
实现方案
方法1:使用fmt.Sprintf格式化字符串(简单场景适用)
直接用格式化占位符替换ID值,用法简单适合临时简单场景:
import "fmt" // 你的业务变量id id := 123 // 用%d占位符替换数值类型的ID str := fmt.Sprintf(`{ "query": { "match": { "id": %d } } }`, id) s := []byte(str) url := "http://localhost:9200/student/_delete_by_query" _, err = helper.GoDelete(url, s) if err != nil { return err } return nil
注意:如果ID是字符串类型,需要把占位符改为
"%s",避免JSON格式错误。该方法存在特殊字符导致JSON语法异常、注入风险,复杂场景更推荐下面的结构体序列化方案。
方法2:使用JSON结构体序列化(推荐,安全无格式问题)
通过Go标准库encoding/json将结构体序列化为符合要求的ES查询字节流,完全避免手动拼接字符串的各类问题:
import "encoding/json" // 定义和ES查询结构对应的结构体 type EsDeleteQuery struct { Query EsQuery `json:"query"` } type EsQuery struct { Match EsMatch `json:"match"` } type EsMatch struct { ID int `json:"id"` // 如果ID是字符串类型就把字段类型改为string } // 你的业务变量id id := 123 // 实例化结构体填充变量 query := EsDeleteQuery{ Query: EsQuery{ Match: EsMatch{ ID: id, }, }, } // 序列化直接得到JSON字节流 s, err := json.Marshal(query) if err != nil { return err } url := "http://localhost:9200/student/_delete_by_query" _, err = helper.GoDelete(url, s) if err != nil { return err } return nil
内容的提问来源于stack exchange,提问作者ord_bear
相关产品推荐
相关产品推荐

