如何在 Golang 中将数组传递给 Elasticsearch 的 NewTermsQuery?

jim*_*mmy 7 go elasticsearch

我想使用 Golang 实现以下 Elasticsearch 查询。

{
  "query": {
    "bool": {
      "must": {
        "range": { "sales_start_date": { "gte": "2018-07-01T00:00:00.000Z" } }
      },
      "filter": {
        "terms": { "item_holder_id": [2, 7, 9] }
      }
    }
  }
}
'
Run Code Online (Sandbox Code Playgroud)

我当前的代码如下(我使用的是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))
Run Code Online (Sandbox Code Playgroud)

ihids 是一个[]int. 当我执行此代码时,出现错误

elastic: Error 400 (Bad Request): [terms] unknown token [END_ARRAY] after [item_holder_id] [type=parsing_exception]
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我发现我需要这样写

elastic.NewTermsQuery("item_holder_id", "1", "2")
Run Code Online (Sandbox Code Playgroud)

但是作为 Golang 的新手,我想我遗漏了一些基本概念。如何传递这样的值数组?

感谢您提供任何可以帮助我的信息!

omo*_*tto 7

为了完成@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...))
Run Code Online (Sandbox Code Playgroud)

我有同样的问题,我以这种方式解决了。


Ull*_*kut 0

您可以通过在参数...后面添加来简单地修复它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...))
Run Code Online (Sandbox Code Playgroud)

有关其工作原理的解释,来自golang 规范

如果 f 是最终参数类型为 ...T 的可变参数,则在函数内该参数相当于 []T 类型的参数。每次调用 f 时,传递给最终参数的参数是 []T 类型的新切片,其连续元素是实际参数,所有这些参数都必须可分配给类型 T。