Как вы суммируете поле сценария с помощью Python'sasticsearch_dsl Search?
Это работает для меня правильно:
search = Search(using=client, index='my_index').script_fields(
special={'script': {
'source': "<a formula that produces a double>"}
}
)
А теперь я хочу приложить сумму к полю special
через все хиты. Я попробовал это:
search = Search(using=client, index='my_index').script_fields(
special={'script': {
'source': "<a formula that produces a double>"}
}
).aggs.metric('total', 'sum', field='special')
Но когда я проверяю aggs
По поводу ответа я получаю
{'total': {'value': 0.0}}
Сам ответ говорит мне, что special
заполняется правильно для каждой записи, и это всегда положительно. Это выглядит немного мне как special
может не быть рядом в то время, когда происходит сумма, так что упорный поиск не видит ее, и поэтому он составляет сумму 0
, Я экспериментировал с pipeline
на месте metric
но это ничего не изменило. То, что я предлагаю, должно быть возможным, верно?
Я мог бы сделать сумму в моем сценарии, а не через asticsearch, но я держу пари, что сумма на стороне ES будет намного быстрее.
Обновить
Основываясь на этом обсуждении на форуме asticsearch, я думаю, что нашел способ, которым он должен работать, но он все еще не работает должным образом для меня. Вы предоставляете сценарий внутри агрегации следующим образом:
s=Search(using=client, index='my_index').aggs.pipeline('total', 'sum', script={'source': "<the special formula>"})
Проблема сейчас в том, что вывод не правильный. В тестовом индексе с одним элементом заданного времени я попытался сообщить об этом поле в суммировании, и вместо ожидаемого результата (значения поля) я получил нечто, отличающееся на 128.
Обновить
Я получил ответ на эту последнюю проблему на справочном форуме asticsearch: https://discuss.elastic.co/t/script-aggregation-yields-wrong-but-close-answer/133744/3?u=rschwieb
Короче говоря, данные, хранящиеся в поле, были интерпретированы как эластичные по двойному типу, но при агрегации использовался тип, определенный отображением для индекса (вместо этого было указано "float"). После повторной индексации поля в виде двойного числа числа соответствуют ожидаемым.