我想使用Golang实施以下Elasticsearch查询。
{
"query": {
"bool": {
"must": {
"range": { "sales_start_date": { "gte": "2018-07-01T00:00:00.000Z" } }
},
"filter": {
"terms": { "item_holder_id": [2, 7, 9] }
}
}
}
}
'
我当前的代码如下(我正在使用http://github.com/olivere/elastic库)。
query := elastic.NewBoolQuery()
query = query.Must(elastic.NewRangeQuery("sales_start_date").Gte(date).TimeZone("+09:00"))
query = query.Filter(elastic.NewTermsQuery("item_holder_id", ihids))
,其中ihids是[]int
。
当我执行此代码时,我得到了错误
elastic: Error 400 (Bad Request): [terms] unknown token [END_ARRAY] after [item_holder_id] [type=parsing_exception]
经过研究,我发现我需要这样写
elastic.NewTermsQuery("item_holder_id", "1", "2")
但是对Golang还是陌生的,我想我缺少了一些基本概念。如何传递这样的值数组?
感谢您提供任何可以帮助我的信息!
答案 0 :(得分:1)
您可以通过在...
参数后添加ihids
来解决此问题,如下所示:
query := elastic.NewBoolQuery()
query = query.Must(elastic.NewRangeQuery("sales_start_date").Gte(date).TimeZone("+09:00"))
query = query.Filter(elastic.NewTermsQuery("item_holder_id", ihids...))
有关其工作原理的解释,来自golang spec:
如果f是最终参数类型为... T的可变参数,则在 函数参数等于[] T类型的参数。在 每次调用f时,传递给最终参数的参数都是新的 类型为[] T的切片,其连续元素是实际参数, 所有这些都必须可分配给类型T。
答案 1 :(得分:1)
以完成@Ullaakut答案:
// Convert type []int to type []interface{}
status := make([]interface{}, len(ihids))
for index, value := range ihids {
status[index] = value
}
// Ullaakut aswer
query := elastic.NewBoolQuery()
query = query.Must(elastic.NewRangeQuery("sales_start_date").Gte(date).TimeZone("+09:00"))
query = query.Filter(elastic.NewTermsQuery("item_holder_id", status...))
我遇到了同样的问题,并且以这种方式解决了。
答案 2 :(得分:0)
values := make([]interface{}, len(status))
for i, v := range status {
values[i] = v
}
query = query.Filter(elastic.NewTermsQuery("item_holder_id", values...))