json - Elasticsearch 使用 Golang Beats 返回原始 JSON

标签 json string elasticsearch go slice

我正在研究一个节拍来询问我们的 Elasticsearch ,目标是让弹性中的元素修改它们以避免重复。

我写了一个搜索并且它有效:

client,err :=elasticsearch.NewClient(elasticsearch.ClientSettings{URL:host,Index:indexSel,Username: username,Password: password,Timeout:  60 * time.Second,}, nil)
if err != nil {
    log.Fatal(err)
}

params := map[string]string{
    "q": "_id:"+maref,
}
_, resp, err := client.SearchURI(index, "", params)

if err != nil {
    log.Fatal(err)
    return
} else {
    fmt.Println(string(resp))
}

下面是来自弹性 api.go 的函数:

func (es *Connection) SearchURI(index string, docType string, params map[string]string) (int, *SearchResults, error) {
status, resp, err := es.apiCall("GET", index, docType, "_search", "", params, nil)
if err != nil {
    return status, nil, err
}
result, err := readSearchResult(resp)
    return status, result, err
}


func readSearchResult(obj []byte) (*SearchResults, error) {
    var result SearchResults
    if obj == nil {
        return nil, nil
    }

    err := json.Unmarshal(obj, &result)
    if err != nil {
        return nil, err
    }
    return &result, err
}

具有以下类型:

type SearchResults struct {
    Took   int                        `json:"took"`
    Shards json.RawMessage            `json:"_shards"`
    Hits   Hits                       `json:"hits"`
    Aggs   map[string]json.RawMessage `json:"aggregations"`
}

type Hits struct {
    Total int
    Hits  []json.RawMessage `json:"hits"`
}

目前答案是原始 JSON:

&{11 [123 34 116 111 116 97 108 34 58 53 44 34 115 117 99 99 101 115 115 102 117 108 34 58 53 44 34 102 97 105 108 101 100 34 58 48 125] {1 [[123 34 95 105 110 100 101 120 34 58 34 99 111 112 105 108 98 101 97 116 45 50 48 49 54 46 49 48 46 50 53 34 44 34 95 116 121 112 101 34 58 34 73 110 99 105 100 101 110 116 34 44 34 95 105 100 34 58 34 65 86 102 54 55 69 103 109 74 66 45 119 85 116 103 82 99 90 113 97 34 44 34 95 115 99 111 114 101 34 58 49 46 48 44 34 95 115 111 117 114 99 101 34 58 123 34 64 116 105 109 101 115 116 97 109 112 34 58 34 50 48 49 54 45 49 48 45 50 53 84 48 56 58 49 54 58 53 55 46 53 53 57 90 34 44 34 97 103 101 110 116 95 105 100 34 58 49 53 44 34 98 101 97 116 34 58 123 34 104 111 115 116 110 97 109 101 34 58 34 53 55 99 53 99 49 57 49 101 48 100 57 34 44 34 110 97 109 101 34 58 34 53 55 99 53 99 49 57 49 101 48 100 57 34 125 44 34 100 101 115 99 114 105 112 116 105 111 110 34 58 34 101 108 97 115 116 105 99 34 44 34 102 105 110 97 108 99 108 97 115 115 34 58 34 34 44 34 105 100 34 58 34 73 45 48 48 53 56 50 54 34 44 34 111 114 103 95 105 100 34 58 49 55 44 34 111 114 103 95 110 97 109 101 34 58 34 83 104 97 109 34 44 34 112 114 105 111 114 105 116 121 34 58 52 44 34 114 101 102 101 114 101 110 99 101 34 58 34 73 45 48 48 53 56 50 54 34 44 34 115 116 97 114 116 95 100 97 116 101 34 58 34 50 48 49 54 45 49 48 45 50 53 84 49 48 58 49 54 58 53 54 46 56 56 49 55 55 52 49 43 48 50 58 48 48 34 44 34 115 116 97 116 117 115 34 58 34 97 115 115 105 103 110 101 100 34 44 34 116 116 111 34 58 48 44 34 116 116 111 95 49 48 48 95 116 114 105 103 103 101 114 101 100 34 58 48 44 34 116 116 114 34 58 48 44 34 116 116 114 95 49 48 48 95 116 114 105 103 103 101 114 101 100 34 58 48 44 34 116 121 112 101 34 58 34 73 110 99 105 100 101 110 116 34 125 125]]} map[]}

所以我的问题是:

如何将结果转换为 ascii? 我读过这可能是由于 json.RawMessage 类型不转换 JSON 但我找不到如何转换它。

提前致谢

Plosxh.

编辑:解决方案:

感谢 icza,这是我的解决方案,我将 "fmt.Println(resp)" 更改为:

for _, v := range resp.Hits.Hits {
    fmt.Println(string(v))
}

它就像一个魅力!

编辑 2: 我不得不重新创建一个完整的类型 en json.Unmarshal "resp.Hits.Hits"以便像常规 json 一样使用它。

最佳答案

json.RawMessage是一个 byte slice :

type RawMessage []byte

您可以将字节 slice 转换为具有简单类型的字符串 conversion :

var result SearchResults
// ...
for _, v := range result.Hits {
    fmt.Println("Total:", v.Total, "Hits:", string(v.Hits))
}

或者:

fmt.Printf("Total: %d, Hits: %s\n", v.Total, v.Hits)

看这个例子:

var raw json.RawMessage
raw = json.RawMessage(`something raw`)
fmt.Println(raw)
fmt.Println(string(raw))
fmt.Printf("%s\n", raw)

输出(在 Go Playground 上尝试):

[115 111 109 101 116 104 105 110 103 32 114 97 119]
something raw
something raw

关于json - Elasticsearch 使用 Golang Beats 返回原始 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40236700/

相关文章:

json - 需要管理测试 RESTful Web 服务的测试人员的最佳实践是什么?

python - 如何重新格式化一串字符串操作并获取其结果

python - 整数不转换为字符串不转换为字符串(python)

javascript - 如何从MSearch返回数组匹配

lucene - Elasticsearch查询多种类型并按类型分组?

java - 使用 Jackson 将复杂的 JSON 转换为一级 POJO

json - Go lang 解码 io.read JSON 与 JSON解码给出不同的结果

php - 从 PHP 中的查询字符串中删除空白变量和重复变量

elasticsearch - ES错误编号[查询]未注册[已过滤]

javascript - 如何在 Ajax $.getJSON() 中获取 Json 作为键和值?