如何处理elasticsearch回复的golang中的嵌套结构?

kuarbcqp  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(0)|浏览(342)

我有一个用go编写的api服务,使用gin-gonic,它由elasticsearch服务支持。查询命中api,api服务器查询elasticsearch,elasticsearch将搜索结果回复给api,api将结果返回给启动流程的一方。所有这一切都“工作”,端到端,但有一个问题。
在elasticsearch中,我有20个索引——每个索引有数千个文档。当我使用go elasticsearch通过gin gonic查询elasticsearch中的一个索引时,我得到了一个elasticsearch结果,该结果被解组到以下结构中:

type esResult struct {
        Took     int        `json:"took"`
        Timedout bool       `json:"timed_out"`
        Shards   jsonShards `json:"_shards"`
        Hits     jsonHits   `json:"hits"`
}

type jsonShards struct {
        Total      int `json:"total"`
        Successful int `json:"successful"`
        Skipped    int `json:"skipped"`
        Failed     int `json:"failed"`
}

type jsonHits struct {
        Total    jsonTotal     `json:"total"`
        Maxscore float64       `json:"max_score"`
        Hitlist  []jsonHitlist `json:"hits"`
}

type jsonHitlist struct {
        Index string  `json:"_index"`
        Type  string  `json:"_type"`
        ID    string  `json:"_id"`
        Score float64 `json:"_score"`
        Source customForIndex `json:"_source"`
        //      Source []byte `json:"_source"`
}

我的问题是,当esresult.hits.hitlist.source字段(上面显示为“customforindex”类型的结构)根据我查询的索引而不同时。
我想做的是:

var esres esResult
                err := json.Unmarshal(resp, &esres)

如果我使用customforindex,那就可以了,但是如果我将source设置为string或[]byte(这样我就可以分别解组源代码),它似乎就不起作用了。
我知道解决方法很糟糕,就是定义重复的结构(每个索引一个集合),但是这很糟糕,因为它会导致许多esresult结构、许多hits结构等等,这些都是重复的。
那么,如何解组elasticsearch回复,以便获得回复的自定义部分呢?
换言之,如果我从elasticsearch获取回复并将其直接传递给api服务器(从而传递给客户端),而不进行任何处理,那么它将包含各种(与客户端无关的)elasticsearch信息。所以我的计划是去掉所有这些,只在elasticsearch回复中包含源对象的数据。但是如果我解组esresult,esresult本身在其他索引上是无效的,因为子结构是不同的。
思想?任何帮助都将不胜感激。基本上,我的问题涉及到在golang中解组嵌套结构,并且恰好出现在elasticsearch用例中,因为大多数(但不是全部)结构在索引之间是重复的。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题