GoLang从弹性搜索结果

时间:2018-04-17 23:19:47

标签: elasticsearch go go-gin

我使用“github.com/olivere/elastic”从Elasticsearch返回数据。那种工作,当我将它添加到我的结构并将其串起来时,就像这样,

data := Api {
    Total: myTotal,
    Data: string(result),
}

c.JSON(http.StatusOK, totalData)

api就是这样的结构,

type Api struct {
   Total interface{}
   Data interface{} 
}

这将返回数据ok,从1到请求的任意数量的结果。加载到数据接口的结果如何不被转义或某些东西,例如

"Data":"{\"CID\":\"XXXXXXXXXX\",\"Link\":\"XXXXXXXXX\",

所以我尝试在将数据添加到api结构之前解组数据。

var p DataApi

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

totalData := Api {
    Total: myTotal,
    Data: p,
}

c.JSON(http.StatusOK, totalData)

这种工作正常,以正确的方式返回数据,但仅在加载一个结果时。当请求2个或更多结果时,我从unmarshal panic

中得到此错误
invalid character '{' after top-level value

我已经尝试过谷歌了但是找不到解决方法吗?我不确定我做错了什么? DataApi是一组嵌套的结构,我不确定是否有任何我应该存在的东西?

这是在Gin框架内运行。

感谢。

修改

因此,当我在字符串(结果)上使用fmt.Println时,我可以在屏幕上打印任意数量的结果。如何将其添加到API结构中,然后我需要将结构转换为JSON数据。有没有办法在JSON转换的API结构上附加此字符串数据?

3 个答案:

答案 0 :(得分:0)

尝试将多个结果解组为切片:

var q []Api
err = json.Unmarshal(result, &q)

参见游乐场https://play.golang.org/p/D_bVAd4jBlI

package main

import (
    "encoding/json"
    "fmt"
)

type Api struct {
    Total interface{}
    Data  interface{}
}

func main() {

    data := Api{
        Total: 1,
        Data:  "2",
    }

    result, err := json.Marshal(data)
    if err != nil {
        panic(err)
    }

    fmt.Printf("single data: %s\n", result)

    var p Api
    err = json.Unmarshal(result, &p)
    if err != nil {
        panic(err)
    }

    dataSlice := []Api{data}

    result, err = json.Marshal(dataSlice)
    if err != nil {
        panic(err)
    }

    fmt.Printf("slice of data: %s\n", result)

    var q []Api
    err = json.Unmarshal(result, &q)
    if err != nil {
        panic(err)
    }
}

答案 1 :(得分:0)

使用json.RawMessage存储任意JSON文档:

var p json.RawMessage

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

totalData := Api {
    Total: myTotal,
    Data: p,
}

c.JSON(http.StatusOK, totalData)

答案 2 :(得分:0)

我有一个解决我的问题的工作方案,我只是使用Hits Hits从弹性搜索返回的数据,我想只是源数据,但我认为它做了我需要它做的...现在。

感谢。