Как вы суммируете поле сценария с помощью 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"). После повторной индексации поля в виде двойного числа числа соответствуют ожидаемым.

0 ответов

Другие вопросы по тегам