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

时间:2018-10-02 02:09:10

标签: elasticsearch go

我想使用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还是陌生的,我想我缺少了一些基本概念。如何传递这样的值数组?

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

3 个答案:

答案 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...))