Как передать массив в NewTermsQuery Elasticsearch в Голанге? - PullRequest
0 голосов
/ 02 октября 2018

Я хочу реализовать следующий запрос Elasticsearch с использованием Golang.

{
  "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")

, но, будучи новичком в Голанге, я думаю, что яотсутствует некоторые основные понятия.Как я могу передать массив значений, подобных этому?

Спасибо за любую информацию, которая может мне помочь!

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

чтобы завершить ответ @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...))

У меня была та же проблема, и я решил по этому пути.

0 голосов
/ 02 октября 2018

Вы можете просто исправить это, добавив ... после вашего 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 :

Если f - переменная с конечным типом параметра ... T, то внутри функции аргумент эквивалентен параметру типа [] T.При каждом вызове f аргумент, передаваемый в последний параметр, представляет собой новый фрагмент типа [] T, чьи последовательные элементы являются фактическими аргументами, и все они должны присваиваться типу T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...