我有一个用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用例中,因为大多数(但不是全部)结构在索引之间是重复的。
暂无答案!
目前还没有任何答案,快来回答吧!