为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中访问弹性响应值

如何在 Go 中访问弹性响应值

Go
慕侠2389804 2022-06-13 15:53:36
我正在使用 go-elasticsearch,它是弹性的官方包。这是我的弹性响应:{  "took": 12,  "timed_out": false,  "_shards": {    "total": 1,    "successful": 1,    "skipped": 0,    "failed": 0  },  "hits": {    "total": {      "value": 0,      "relation": "eq"    },    "max_score": null,    "hits": [    ]  },  "suggest": {    "compeletion-suggest": [      {        "text": "txt",        "offset": 0,        "length": 3,        "options": [          {            "text": "sometext_result1",            "_index": "myindex",            "_type": "_doc",            "_id": "id1",            "_score": 2.0,            "_source": {              "content_completion": {                "input": [                  "sometext_result1"                ],                "weight": 2              }            }          },          {            "text": "sometext_result2",            "_index": "myindex",            "_type": "_doc",            "_id": "id2",            "_score": 1.0,            "_source": {              "content_completion": {                "input": [                  "sometext_result2"                ],                "weight": 1              }            }          },      ]   }}我想迭代“选项”,我已经尝试过这个:var (    r  map[string]interface{})es, err := elasticsearch.NewDefaultClient()var buf bytes.Bufferquery := map[string]interface{}{    "suggest": map[string]interface{}{        "compeletion-suggest": map[string]interface{}{            "prefix": "txt",            "completion": map[string]interface{}{                "field": "content_completion",            },        },    },}if err := json.NewEncoder(&buf).Encode(query); err != nil {    log.Fatalf("Error encoding query: %s", err)}res, err = es.Search(    es.Search.WithContext(context.Background()),    es.Search.WithIndex("myindex"),    es.Search.WithBody(&buf),    es.Search.WithTrackTotalHits(true),    es.Search.WithPretty(),)我是 Go 新手。我需要知道如何访问弹性响应字段。例如,如何读取选项的 _id 字段?
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

您发布为 JSON 的 Elasticsearch 响应似乎并不完全正确(缺少几个括号并且缩进错误)我已经进行了编辑,因此无需担心。


谈到循环问题,你的 for 循环应该是这样的:


for _, suggestion := range r["suggest"].(map[string]interface{})["compeletion-suggest"].([]interface{}) {

    options := suggestion.(map[string]interface{})["options"]


    for _, option := range options.([]interface{}) {

        log.Printf(" * option=%s", option)

    }

}

你忘了提到这样的范围options.([]interface{})


这给了我这样的输出:


2020/06/28 23:57:03  * option=map[_id:id1 _index:myindex _score:%!s(float64=2) _source:map[content_completion:map[input:[sometext_result1] weight:%!s(float64=2)]] _type:_doc text:sometext_result1]

2020/06/28 23:57:03  * option=map[_id:id2 _index:myindex _score:%!s(float64=1) _source:map[content_completion:map[input:[sometext_result2] weight:%!s(float64=1)]] _type:_doc text:sometext_result2]

我希望这是你想要达到的目标。:)


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信